2017-04-03 137 views
0

我有一個twitter json文件,我試圖將英文和法文推文分成兩個單獨的文件。我使用Python 2.7使用下面的代碼:Python從json文件讀取記錄並寫入兩個單獨的json文件

import json 

with open('tweets.json', 'r') as f: 

with open('english.json', 'w') as enF: 
    with open('french.json', 'w') as frF: 

    for line in f: 
     tweet = json.loads(line) 

     if tweet["lang"] == "en": 
      json.dump(tweet, enF, sort_keys=True) 
     elif tweet["lang"] == "fr": 
      json.dump(tweet, frF, sort_keys=True) 

這將產生兩個獨立的JSON文件,有英語的鳴叫和其他法國,我已經檢查之一。原始文件每行有一條推文。 english.json和french.json文件只包含所有推文的一行。不知道這是否會成爲問題,甚至不確定這是否正確。因此,我通過這個代碼(顯然,我改變了文件名)再次通過english.json,它給出了一個錯誤:

Traceback (most recent call last): 
File "C:\Users\jack\Desktop\twitClean\j4.py", line 10, in <module> 
tweet = json.loads(line) 
File "C:\Python27\lib\json\__init__.py", line 339, in loads 
return _default_decoder.decode(s) 
File "C:\Python27\lib\json\decoder.py", line 367, in decode 
raise ValueError(errmsg("Extra data", s, end, len(s))) 
ValueError: Extra data: line 1 column 4926 - line 1 column 691991 (char 4925 - 691990) 

我一直工作在這過去三天了,都來一無所有。任何人都可以請幫助,並告訴我我做錯了什麼?

+0

當你做'tweet = json.loads(line)'時,你假設每行有一個類似json的元素。這可能是你爲什麼得到錯誤'ValueError:Extra data:[']''的原因。相反,你應該閱讀這樣的json文件,例如使用'json.loads(f)',其中'f'是打開的json文件對象,即'open('tweets.json','r')'。然後你可以探索它。看到上面的答案。它工作嗎? – Kanak

+0

這適用於給新文件。當我通過這段代碼運行其中一個新文件時,它仍然會出現相同的錯誤。 – user1907031

+0

你從'json.loads'中刪除's'嗎?然後,您將使用正確的方法來處理類文件對象,*即*,'json.load',**而不包含s **。如果你得到相同的錯誤,看起來你沒有。看到上面的答案。 – Kanak

回答

0

什麼加載JSON文件這樣

with open('tweets.json', 'r') as f: 
    tweets_dict = json.load(f) 

然後,給出一個JSON的蟒蛇原生表示是dictionnary,你可以ITER它,並建立自己的法語和英語相關dictionnaries以及。我的意思是,做

fr_dict, en_dict, ot_dict = {}, {}, {} 
for id_,tweet in tweets_dict.items(): 
    if tweet['lang'] == 'fr': 
     fr_dict[id_] = tweet 
    elif tweet['lang'] == 'en': 
     en_dict[id_] = tweet 
    else: 
     ot_dict[id_] = tweet 

with open('french.json', 'w') as frF: 
    json.dump(fr_dict, frF, sort_keys=True) 

with open('english.json', 'w') as enF: 
    json.dump(en_dict, enF, sort_keys=True) 

with open('other.json', 'w') as otF: 
    json.dump(ot_dict, otF, sort_keys=True) 
+0

剛剛試過這個並且沒有運行: Traceback(最近調用最後一個): 文件「C:/ Users/jack /文件「C:\ Python27 \ lib \ json \ __init__.py」,第339行,加載中 返回_default_decoder.decode,第4行,在 tweets_dict = json.loads(f) (s) 解碼文件「C:\ Python27 \ lib \ json \ decoder.py」,行364,解碼爲 obj,end = self.raw_decode(s,idx = _w(s,0).end()) TypeError:預期的字符串或緩衝區 – user1907031

+0

@ user1907031。查看更新。 * Mea culpa *要處理文件而不是字符串,它是'json.load'而不是'json.loads'。你只需要放下's'來使用正確的方法。 – Kanak

+0

給出錯誤:AttributeError:'str'對象沒有屬性'讀' – user1907031

0

解決:不幸的是,作爲一個蟒蛇黑客我不能解決這個使用python。我確定必須有一種使用python的方法。所以,如果有人在這裏需要這樣的解決方案是is.The解決方案,我發現用JQ如下:
cat jsonfile | jq '. | select(.lang=="en")' > savefile

顯然使用此代碼的jsonfile必須被讀取兩次,因爲我需要在單獨的英語和法語的鳴叫文件。