我从JSON文件"new.json"获取一些数据,我想过滤一些数据并将其存储到一个新的JSON文件中.这是我的代码:
import json with open('new.json') as infile: data = json.load(infile) for item in data: iden = item.get["id"] a = item.get["a"] b = item.get["b"] c = item.get["c"] if c == 'XYZ' or "XYZ" in data["text"]: filename = 'abc.json' try: outfile = open(filename,'ab') except: outfile = open(filename,'wb') obj_json={} obj_json["ID"] = iden obj_json["VAL_A"] = a obj_json["VAL_B"] = b
我收到一个错误,追溯是:
File "rtfav.py", line 3, indata = json.load(infile) File "/usr/lib64/python2.7/json/__init__.py", line 278, in load **kw) File "/usr/lib64/python2.7/json/__init__.py", line 326, in loads return _default_decoder.decode(s) File "/usr/lib64/python2.7/json/decoder.py", line 369, in decode raise ValueError(errmsg("Extra data", s, end, len(s))) ValueError: Extra data: line 88 column 2 - line 50607 column 2 (char 3077 - 1868399)
有人能帮我吗?
以下是new.json中的数据示例,文件中还有大约1500个这样的词典
{ "contributors": null, "truncated": false, "text": "@HomeShop18 #DreamJob to professional rafter", "in_reply_to_status_id": null, "id": 421584490452893696, "favorite_count": 0, "source": "Mobile Web (M2)", "retweeted": false, "coordinates": null, "entities": { "symbols": [], "user_mentions": [ { "id": 183093247, "indices": [ 0, 11 ], "id_str": "183093247", "screen_name": "HomeShop18", "name": "HomeShop18" } ], "hashtags": [ { "indices": [ 12, 21 ], "text": "DreamJob" } ], "urls": [] }, "in_reply_to_screen_name": "HomeShop18", "id_str": "421584490452893696", "retweet_count": 0, "in_reply_to_user_id": 183093247, "favorited": false, "user": { "follow_request_sent": null, "profile_use_background_image": true, "default_profile_image": false, "id": 2254546045, "verified": false, "profile_image_url_https": "https://pbs.twimg.com/profile_images/413952088880594944/rcdr59OY_normal.jpeg", "profile_sidebar_fill_color": "171106", "profile_text_color": "8A7302", "followers_count": 87, "profile_sidebar_border_color": "BCB302", "id_str": "2254546045", "profile_background_color": "0F0A02", "listed_count": 1, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "utc_offset": null, "statuses_count": 9793, "description": "Rafter. Rafting is what I do. Me aur mera Tablet. Technocrat of Future", "friends_count": 231, "location": "", "profile_link_color": "473623", "profile_image_url": "http://pbs.twimg.com/profile_images/413952088880594944/rcdr59OY_normal.jpeg", "following": null, "geo_enabled": false, "profile_banner_url": "https://pbs.twimg.com/profile_banners/2254546045/1388065343", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "name": "Jayy", "lang": "en", "profile_background_tile": false, "favourites_count": 41, "screen_name": "JzayyPsingh", "notifications": null, "url": null, "created_at": "Fri Dec 20 05:46:00 +0000 2013", "contributors_enabled": false, "time_zone": null, "protected": false, "default_profile": false, "is_translator": false }, "geo": null, "in_reply_to_user_id_str": "183093247", "lang": "en", "created_at": "Fri Jan 10 10:09:09 +0000 2014", "filter_level": "medium", "in_reply_to_status_id_str": null, "place": null }
falsetru.. 130
正如您在下面的示例中所看到的,json.loads
(和json.load
)不会解码多个json对象.
>>> json.loads('{}') {} >>> json.loads('{}{}') # == json.loads(json.dumps({}) + json.dumps({})) Traceback (most recent call last): File "", line 1, in File "C:\Python27\lib\json\__init__.py", line 338, in loads return _default_decoder.decode(s) File "C:\Python27\lib\json\decoder.py", line 368, in decode raise ValueError(errmsg("Extra data", s, end, len(s))) ValueError: Extra data: line 1 column 3 - line 1 column 5 (char 2 - 4)
如果要转储多个字典,将它们包装在列表中,请转储列表(而不是多次转储字典)
>>> dict1 = {} >>> dict2 = {} >>> json.dumps([dict1, dict2]) '[{}, {}]' >>> json.loads(json.dumps([dict1, dict2])) [{}, {}]
您能否参考我上面给出的代码再次解释一下?我是新手,有时需要很长时间才能掌握这些东西. (6认同)
Adam Hughes.. 76
我是否可以建议您不必将所有推文打包到列表中然后执行json.dumps
.您可以随时写入文件,然后使用以下命令加载它们:
tweets = [] for line in open('tweets.json', 'r'): tweets.append(json.loads(line))
这样您就不必存储中间python对象.只要你每次append()
通话写一个完整的推文,这应该有效.
一线解决您的问题:
data = [json.loads(line) for line in open('tweets.json', 'r')]
正如您在下面的示例中所看到的,json.loads
(和json.load
)不会解码多个json对象.
>>> json.loads('{}') {} >>> json.loads('{}{}') # == json.loads(json.dumps({}) + json.dumps({})) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python27\lib\json\__init__.py", line 338, in loads return _default_decoder.decode(s) File "C:\Python27\lib\json\decoder.py", line 368, in decode raise ValueError(errmsg("Extra data", s, end, len(s))) ValueError: Extra data: line 1 column 3 - line 1 column 5 (char 2 - 4)
如果要转储多个字典,将它们包装在列表中,请转储列表(而不是多次转储字典)
>>> dict1 = {} >>> dict2 = {} >>> json.dumps([dict1, dict2]) '[{}, {}]' >>> json.loads(json.dumps([dict1, dict2])) [{}, {}]
如果您的JSON文件不仅仅是1个JSON记录,也可能发生这种情况.JSON记录如下所示:
[{"some data": value, "next key": "another value"}]
它用括号[]打开和关闭,括号内是大括号{}.可以有很多对括号,但它们都以一个紧密的括号结束.如果您的json文件包含多个:
[{"some data": value, "next key": "another value"}] [{"2nd record data": value, "2nd record key": "another value"}]
然后loads()将失败.
我用我自己的文件验证了这个失败.
import json guestFile = open("1_guests.json",'r') guestData = guestFile.read() guestFile.close() gdfJson = json.loads(guestData)
这是有效的,因为1_guests.json有一个记录[].我使用all_guests.json的原始文件有6条用换行符分隔的记录.我删除了5条记录(我已经通过括号检查了这些记录)并以新名称保存了该文件.然后load语句工作.
错误是
raise ValueError(errmsg("Extra data", s, end, len(s))) ValueError: Extra data: line 2 column 1 - line 10 column 1 (char 261900 - 6964758)
PS.我使用单词record,但这不是官方名称.此外,如果你的文件有像我一样的换行符,你可以循环遍历它,将一条记录一次加载到一个json变量中.
我是否可以建议您不必将所有推文打包到列表中然后执行json.dumps
.您可以随时写入文件,然后使用以下命令加载它们:
tweets = [] for line in open('tweets.json', 'r'): tweets.append(json.loads(line))
这样您就不必存储中间python对象.只要你每次append()
通话写一个完整的推文,这应该有效.
我遇到这个是因为我试图加载从MongoDB转储的JSON文件.它给了我一个错误
JSONDecodeError: Extra data: line 2 column 1
MongoDB JSON转储每行有一个对象,所以对我有用的是:
import json data = [] with open('data.json') as f: for line in f: data.append(json.loads(line))