Питон в формате JSON.нагрузки показывает ValueError: дополнительные данные



Я получаю некоторые данные из файла 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, in <module>
data = 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": "<a href="https://mobile.twitter.com" rel="nofollow">Mobile Web (M2)</a>",
"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
}
752   4  

4 ответов:

как вы можете видеть на следующем примере, json.loadsjson.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.dumps. Вы можете просто написать в файл, как вы идете, а затем загрузить их с:

tweets = []
for line in open('test.txt', 'r'):
    tweets.append(json.loads(line))

таким образом, вам не нужно хранить промежуточные объекты python. Пока вы пишете один полный твит за вызов записи, это должно работать.

Это также может произойти, если ваш файл 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 записей (которые я уже проверил, чтобы быть записаны в скобках) и сохранил файл под новым именем. Затем оператор загружает работал.

ошибка

   raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 2 column 1 - line 10 column 1 (char 261900 - 6964758)

PS. Я использую слово запись, но это не официальное название. Кроме того, если ваш файл имеет символы новой строки, такие как мой, вы можете перебирать его для загрузки () по одной записи за раз в a переменная json.

я столкнулся с этим, потому что я пытался загрузить файл JSON, сброшенный с MongoDB. Это давало мне ошибку

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))

Comments

    Ничего не найдено.