webentwicklung-frage-antwort-db.com.de

Python json.loads zeigt ValueError: Zusätzliche Daten

Ich erhalte 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 bekomme eine Fehlermeldung, das Traceback ist:

  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. In der Datei sind noch etwa 1500 solcher Wörterbücher enthalten

{
    "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
} 
94
Apoorv Ashutosh

Wie Sie im folgenden Beispiel sehen können, decodiert json.loads (und json.load) nicht mehrere Json-Objekte.

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

Wenn Sie mehrere Wörterbücher ausgeben möchten, packen Sie sie in eine Liste ein, und sichern Sie die Liste (anstatt mehrmals Wörterbücher auszugeben).

>>> dict1 = {}
>>> dict2 = {}
>>> json.dumps([dict1, dict2])
'[{}, {}]'
>>> json.loads(json.dumps([dict1, dict2]))
[{}, {}]
110
falsetru

Kann ich nur vorschlagen, dass Sie nicht alle Tweets in eine Liste packen müssen und dann json.dumps tun. Sie können einfach in eine Datei schreiben und sie dann mit folgendem Befehl laden:

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

Auf diese Weise müssen Sie keine Python-Zwischenobjekte speichern. Solange Sie einen vollständigen Tweet pro Aufruf von append() schreiben, sollte dies funktionieren.

54
Adam Hughes

Ich bin darauf gestoßen, weil ich versuchte, eine aus MongoDB abgelegte JSON-Datei zu laden. Es gab mir einen Fehler 

JSONDecodeError: Extra data: line 2 column 1

Der MongoDB-JSON-Dump hat ein Objekt pro Zeile. Was für mich funktioniert hat:

import json    

data = []
with open('data.json') as f:
    for line in f:
        data.append(json.loads(line))
9
Nic Scozzaro

Dies kann auch passieren, wenn Ihre JSON-Datei nicht nur aus einem JSON-Datensatz besteht ..__ Ein JSON-Datensatz sieht folgendermaßen aus:

[{"some data": value, "next key": "another value"}]

Es öffnet und schließt sich mit einer Klammer [], in der Klammer befinden sich die Klammern {}. Es kann viele geschweifte Klammern geben, aber es endet mit einer schließenden Klammer] . Wenn Ihre Json-Datei mehr als eine der folgenden enthält:

[{"some data": value, "next key": "another value"}]
[{"2nd record data": value, "2nd record key": "another value"}]

dann wird das load () fehlschlagen.

Ich habe dies mit meiner eigenen Datei überprüft, die fehlgeschlagen ist.

import json

guestFile = open("1_guests.json",'r')
guestData = guestFile.read()
guestFile.close()
gdfJson = json.loads(guestData)

Dies funktioniert, weil 1_guests.json einen Datensatz [] hat. Die Originaldatei, die ich mit all_guests.json verwendete, hatte 6 Einträge, die durch Zeilenumbrüche getrennt waren. Ich habe 5 Datensätze gelöscht (die ich bereits in Klammern als Biegung markiert habe) und die Datei unter einem neuen Namen gespeichert. Dann funktionierte die load-Anweisung.

Fehler war

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

PS. Ich benutze den Word-Datensatz, aber das ist nicht der offizielle Name. Wenn Ihre Datei Zeilenumbrüche wie die meine enthält, können Sie sie zu load () Datensatz für Datensatz in eine Json-Variable durchlaufen.

9
VISQL

Ich denke, das Speichern von Dikten in einer Liste ist keine ideale Lösung, die hier von @falsetru vorgeschlagen wird.

Besser ist es, Dikte durchzugehen und sie in .json zu speichern, indem Sie eine neue Zeile hinzufügen.

unsere 2 Wörterbücher sind

d1 = {'a':1}

d2 = {'b':2}

sie können sie an .json schreiben

import json
with open('sample.json','a') as sample:
    for dict in [d1,d2]:
        sample.write('{}\n'.format(json.dumps(dict)))

und Sie können JSON-Datei ohne Probleme lesen

with open('sample.json','r') as sample:
    for line in sample:
        line = json.loads(line.strip())

einfach und effizient

0
murat yalçın

Nun, es könnte jemandem helfen. Ich habe gerade den gleichen Fehler, während meine JSON-Datei so ist

{"id":"1101010","city_id":"1101","name":"TEUPAH SELATAN"}
{"id":"1101020","city_id":"1101","name":"SIMEULUE TIMUR"}

und ich fand es missgebildet, so dass ich es in eine Art von änderte

{
  "datas":[
    {"id":"1101010","city_id":"1101","name":"TEUPAH SELATAN"},
    {"id":"1101020","city_id":"1101","name":"SIMEULUE TIMUR"}
  ]
}
0
Akbar Noto

Einzeiler für Ihr Problem:

data = [json.loads(line) for line in open('tweets.json', 'r')]
0
Nihal

Wenn Sie es in einem Doppelliner lösen wollen, können Sie dies folgendermaßen tun: 

with open('data.json') as f:
    data = [json.loads(line) for line in f]
0
coreehi