Pobieram dane z pliku JSON „new.json” i chcę przefiltrować niektóre dane i zapisać je w nowym pliku JSON. Oto mój kod:
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
i otrzymuję błąd, śledzenie to:
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)
Czy ktoś może mi pomóc?
Oto próbka danych w new.json, w pliku jest około 1500 innych takich słowników
{
"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
}
more than one object per line
Odpowiedzi:
Jak widać w poniższym przykładzie,
json.loads
(ijson.load
) nie dekoduje wielu obiektów json.Jeśli chcesz zrzucić wiele słowników, zawiń je w listę, zrzuć listę (zamiast wielokrotnego zrzucania słowników)
źródło
new.json
zawiera plik json i inne nadmiarowe dane.json.load
,json.loads
może tylko zdekodować plik json. Podnosi a,ValueError
gdy napotka dodatkowe dane, jak widzisz.new.json
, po prostu umieść pojedynczy plik json w pliku.Możesz po prostu czytać z pliku,
jsonifying
każdą linię w trakcie:Pozwala to uniknąć przechowywania pośrednich obiektów Pythona. Dopóki piszesz jeden pełny tweet na
append()
połączenie, powinno to działać.źródło
Natknąłem się na to, ponieważ próbowałem załadować plik JSON zrzucony z MongoDB. Dało mi to błąd
Zrzut MongoDB JSON ma jeden obiekt w każdym wierszu, więc zadziałało dla mnie:
źródło
Może się to również zdarzyć, jeśli plik JSON nie jest tylko jednym rekordem JSON. Rekord JSON wygląda następująco:
Otwiera się i zamyka nawiasem [], w nawiasach są nawiasy {}. Może być wiele par nawiasów, ale wszystko kończy się nawiasem zamykającym]. Jeśli plik json zawiera więcej niż jeden z nich:
wtedy load () nie powiedzie się.
Sprawdziłem to na moim własnym pliku, który się nie udał.
To działa, ponieważ 1_guests.json ma jeden rekord []. Oryginalny plik all_guests.json, którego używałem, miał 6 rekordów oddzielonych znakiem nowej linii. Usunąłem 5 rekordów (które już sprawdziłem, aby były zaksięgowane w nawiasach) i zapisałem plik pod nową nazwą. Następnie instrukcja obciążenia zadziałała.
Błąd był
PS. Używam słowa rekord, ale to nie jest oficjalna nazwa. Ponadto, jeśli twój plik zawiera znaki nowej linii, takie jak mój, możesz zapętlić go, aby załadować () jeden rekord na raz do zmiennej JSON.
źródło
json.loads
odczytanie fragmentów JSON rozdzielonych znakami nowej linii? To znaczy zachowywać się jak[json.loads(x) for x in text.split('\n')]
? Powiązane: Czy istnieje gwarancja,json.dumps
która nie uwzględni dosłownych znaków nowej linii w wynikach z domyślnymi wcięciami?json.dumps
zmieni znaki nowej linii w treści tekstowej na"\n"
, zachowując json do jednej linii.Cóż, może to komuś pomóc. właśnie otrzymałem ten sam błąd, podczas gdy mój plik json jest taki
i stwierdziłem, że jest źle sformułowany, więc zmieniłem go na coś w rodzaju
źródło
Jedna linijka dla twojego problemu:
źródło
Jeśli chcesz rozwiązać to w dwuwierszowym, możesz to zrobić w ten sposób:
źródło
Myślę, że zapisywanie dykt na liście nie jest idealnym rozwiązaniem proponowanym przez @falsetru.
Lepszym sposobem jest iterowanie przez dykty i zapisywanie ich w .json przez dodanie nowej linii.
nasze 2 słowniki to
możesz napisać je do .json
i możesz czytać plik json bez żadnych problemów
proste i wydajne
źródło