2017-04-03 170 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必须被读取两次,因为我需要在单独的英语和法语的鸣叫文件。