2017-08-06 593 views
1

早上好Python - 追加到循環中的Json文件

昨天我開始爲cryptocurrency市場寫一個簡單的公告機器人。 在這一點上,我想閱讀股票行情(市場價格)並實時將數據保存到.json文件中。 Python的dump函數可以做到這一點。到目前爲止,代碼如下所示

start = time.time() 
while 1: 
    end = time.time() 
    raz = end - start 
    if raz >= 5: 
     for i in range(len(self.keys)): 
      self.dictTicker(self.values[i]) 
      start = end 
    sleep(0.005) 

self.dictTicker是通過選定的市場進入和以.json文件

def dictTicker(self, market): 
    ticker = api.get_ticker(market) 
    self.data['year'] = datetime.now().year 
    self.data['month'] = datetime.now().month 
    self.data['day'] = datetime.now().day 
    self.data['hour'] = datetime.now().hour 
    self.data['min'] = datetime.now().minute 
    self.data['sec'] = datetime.now().second 
    self.data['bid'] = ticker['result']['Bid'] 
    self.data['ask'] = ticker['result']['Ask'] 
    self.data['last'] = ticker['result']['Last'] 

    with open("{}.json".format(market), 'a') as f: 
     json.dump([self.data], f) 
     f.close() 

以.json文件的例子則看起來像這樣保存數據的功能。

{"year": 2017, "month": 8, "day": 6, "hour": 6, "min": 38, "sec": 4, "bid": 0.00224, "ask": 0.00225999, "last": 0.00225999}{"year": 2017, "month": 8, "day": 6, "hour": 6, "min": 38, "sec": 9, "bid": 0.00223611, "ask": 0.00224, "last": 0.00224} 

問題是這種格式{}{}是錯誤的。它應該是{{}{}}。或換句話說,字典列表,而不是多個字典。

當我嘗試閱讀我使用下面的代碼文件:

with open("BTC-SEC.json") as f: 
    a = json.load(f) 
    print(a) 

我收到以下錯誤:

json.decoder.JSONDecodeError: Extra data: line 1 column 121 (char 120) 

我已搜查堆棧,但我不能找到答案那會幫我。任何幫助將不勝感激。

+0

作爲一個側面說明' {{},{}}'不是詞典列表(這是詞典的詞典),'[{},{}]'是詞典列表。 – abagshaw

+0

追加到列表中,然後始終將完整列表作爲JSON寫入文件。 –

回答

0

當您編寫該文件時,您一次只寫一行。你必須在閱讀時做同樣的事情。您可以使用json.loads一次加載一行JSON字符串。

data = [] 
with open("BTC-SEC.json") as f: 
    for line in f:  
     data.append(json.loads(line)) 

一個更好的選擇是將數據追加到一個列表,然後寫列表中的所有一次,所以你也可以閱讀所有一次。

修改你的函數是這樣的:輕微

def dictTicker(self, market): 
    ticker = api.get_ticker(market) 
    self.data['year'] = datetime.now().year 
    self.data['month'] = datetime.now().month 
    self.data['day'] = datetime.now().day 
    self.data['hour'] = datetime.now().hour 
    self.data['min'] = datetime.now().minute 
    self.data['sec'] = datetime.now().second 
    self.data['bid'] = ticker['result']['Bid'] 
    self.data['ask'] = ticker['result']['Ask'] 
    self.data['last'] = ticker['result']['Last'] 

    return self.data.copy() 

你的內循環的變化:

data = [] 
for i in range(len(self.keys)): 
    data.append(self.dictTicker(self.values[i])) 
    start = end 

with open("{}.json".format(market), 'w') as f: # you don't need f.close() with a file manager 
    json.dump(data, f) 

接着,就看它像這樣:

with open("BTC-SEC.json") as f: 
    data = json.load(f) 
+0

感謝您的回答。這段代碼的問題是我需要首先將所有數據存儲在列表中,並最終保存到json中。那麼我需要實時做到這一點(不斷地從json中讀取數據)。數據每5秒保存一次。然後我會對這些數據進行移動平均線和其他技術分析。一切都是實時的。 – Razmooo

+0

@Razmooo如果它的工作,你可以[標記我的答案](https://stackoverflow.com/help/someone-answers)接受。 –