Ich erhalte einige Daten aus einer JSON-Datei "new.json" und möchte einige Daten filtern und in einer neuen JSON-Datei speichern. Hier ist mein Code:
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
und ich erhalte eine Fehlermeldung, der Traceback lautet:
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)
Kann mir jemand helfen?
Hier ist ein Beispiel der Daten in new.json. Die Datei enthält etwa 1500 weitere solcher Wörterbücher
{
"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
Antworten:
Wie Sie im folgenden Beispiel sehen können, dekodiert
json.loads
(undjson.load
) nicht mehrere JSON-Objekte.Wenn Sie mehrere Wörterbücher sichern möchten, wickeln Sie sie in eine Liste ein und sichern Sie die Liste (anstatt Wörterbücher mehrmals zu sichern).
quelle
new.json
einen JSON und andere redundante Daten enthält.json.load
,json.loads
Kann nur eine json dekodieren.ValueError
Wie Sie sehen , wird ein erhöht, wenn zusätzliche Daten auftreten.new.json
, fügen Sie einfach einen einzelnen JSON in eine Datei ein.Sie können einfach aus einer Datei
jsonifying
jede Zeile lesen, während Sie gehen:Dadurch wird vermieden, dass zwischengeschaltete Python-Objekte gespeichert werden. Solange Sie einen vollständigen Tweet pro
append()
Anruf schreiben , sollte dies funktionieren.quelle
Ich bin darauf gestoßen, weil ich versucht habe, eine aus MongoDB gespeicherte JSON-Datei zu laden. Es gab mir einen Fehler
Der MongoDB-JSON-Speicherauszug hat ein Objekt pro Zeile. Für mich hat also Folgendes funktioniert:
quelle
Dies kann auch passieren, wenn Ihre JSON-Datei nicht nur 1 JSON-Datensatz ist. Ein JSON-Datensatz sieht folgendermaßen aus:
Es öffnet und schließt mit einer Klammer [], in den Klammern befinden sich die Klammern {}. Es kann viele Klammerpaare geben, aber alles endet mit einer engen Klammer. Wenn Ihre JSON-Datei mehr als eine davon enthält:
dann schlägt load () fehl.
Ich habe dies mit meiner eigenen Datei überprüft, die fehlgeschlagen ist.
Dies funktioniert, weil 1_guests.json einen Datensatz [] hat. Die ursprüngliche Datei, die ich all_guests.json verwendete, hatte 6 Datensätze, die durch Zeilenumbrüche getrennt waren. Ich habe 5 Datensätze gelöscht (die ich bereits in Klammern überprüft habe) und die Datei unter einem neuen Namen gespeichert. Dann funktionierte die Ladeanweisung.
Fehler war
PS. Ich benutze das Wort Datensatz, aber das ist nicht der offizielle Name. Wenn Ihre Datei Zeilenumbrüche wie meine enthält, können Sie sie durchlaufen, um jeweils einen Datensatz in eine JSON-Variable zu laden ().
quelle
json.loads
durch Zeilenumbrüche getrennte JSON-Chunks zu lesen? Das heißt, sich so zu verhalten[json.loads(x) for x in text.split('\n')]
? Verwandtejson.dumps
Themen : Gibt es eine Garantie, die keine wörtlichen Zeilenumbrüche mit Standardeinzug in die Ausgabe einbezieht?json.dumps
ändert standardmäßig die Zeilenumbrüche im Textinhalt in"\n"
, sodass Ihr JSON in einer einzelnen Zeile bleibt .Nun, es könnte jemandem helfen. Ich habe gerade den gleichen Fehler erhalten, während meine JSON-Datei so ist
und ich fand es missgebildet, also habe ich es in eine Art von geändert
quelle
Einzeiler für Ihr Problem:
quelle
Wenn Sie es in einem Zweiliner lösen möchten, können Sie es folgendermaßen tun:
quelle
Ich denke, das Speichern von Diktaten in einer Liste ist keine ideale Lösung, die hier von @falsetru vorgeschlagen wird.
Besser ist es, Dikte zu durchlaufen und sie durch Hinzufügen einer neuen Zeile in .json zu speichern.
Unsere 2 Wörterbücher sind
Sie können sie an .json schreiben
und Sie können json-Datei ohne Probleme lesen
einfach und effizient
quelle