2017-08-06 18 views
1

おはようPython - ループ内のJsonファイルに追加

昨日私は暗号化市場向けの簡単なアナウンスボットを書き始めました。 この時点で私はティッカー(市場の価格)を読んで、リアルタイムで.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ファイル.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() 

にデータを保存する機能です。

{"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} 

問題は、このフォーマット{}{}が間違っていることです。それは{{}{}}でなければなりません。つまり、辞書のリストであり、複数の辞書ではありません。

私は、次のコードを使用するファイルの読み取りしようとすると:

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

私は、スタック上で検索しましたが、私はだろう答えを見つけるカント:私は次のエラーを取得する

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

を助けて。どんな助けでも大歓迎です。

+0

' {{}、{}} 'は辞書のリスト(辞書の辞書)ではなく、[{}、{}]'は辞書のリストです。 – abagshaw

+0

リストに追加してから、常にJSONとして完全なリストをファイルに書き込みます。 –

答えて

0

ファイルを書き込むときは、一度に1行ずつ書きます。あなたは読んだのと同じことをしなければなりません。 json.loadsを使用すると、一度に1行ずつ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)を受け入れることができます。 –

関連する問題