web-dev-qa-db-fra.com

Python json.loads affiche ValueError: Extra data

Je reçois des données d'un fichier JSON "new.json" et je souhaite filtrer certaines données et les stocker dans un nouveau fichier JSON. Voici mon 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

et je reçois une erreur, la trace est:

  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)

Est-ce que quelqu'un peut m'aider?

Voici un exemple des données de new.json. Le fichier contient environ 1500 autres dictionnaires.

{
    "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

Comme vous pouvez le voir dans l'exemple suivant, json.loads (et json.load) ne décode pas plusieurs objets 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)

Si vous souhaitez sauvegarder plusieurs dictionnaires, placez-les dans une liste, dump de la liste (au lieu de décharger des dictionnaires plusieurs fois)

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

Puis-je simplement suggérer que vous n'avez pas à regrouper tous les tweets dans une liste et ensuite faire json.dumps. Vous pouvez simplement écrire dans un fichier au fur et à mesure, puis les charger avec:

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

De cette façon, vous n’avez pas à stocker d’objets Python intermédiaires. Tant que vous écrivez un tweet complet par appel append(), cela devrait fonctionner.

54
Adam Hughes

Je suis tombé sur cela parce que j'essayais de charger un fichier JSON extrait de MongoDB. Il me donnait une erreur 

JSONDecodeError: Extra data: line 2 column 1

Le dump MongoDB JSON a un objet par ligne. Ce qui a donc fonctionné pour moi est le suivant:

import json    

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

Cela peut également se produire si votre fichier JSON n’est pas simplement un enregistrement JSON . Un enregistrement JSON ressemble à ceci:

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

Il s'ouvre et se ferme avec un crochet [], entre les crochets sont les accolades {}. Il peut y avoir plusieurs paires d'accolades, mais tout se termine par un crochet proche] . Si votre fichier json contient plus d'une de celles-ci:

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

alors load () échouera.

J'ai vérifié cela avec mon propre fichier qui échouait.

import json

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

Cela fonctionne car 1_guests.json a un enregistrement []. Le fichier d'origine que j'utilisais all_guests.json contenait 6 enregistrements séparés par une nouvelle ligne. J'ai supprimé 5 enregistrements (que j'avais déjà coché entre crochets) et sauvegardé le fichier sous un nouveau nom. Ensuite, la déclaration de charges a fonctionné.

Erreur était

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

PS. J'utilise l'enregistrement Word, mais ce n'est pas le nom officiel. De plus, si votre fichier contient des caractères de nouvelle ligne comme le mien, vous pouvez le parcourir pour charger () un enregistrement à la fois dans une variable json.

9
VISQL

Je pense que sauver des dict dans une liste n’est pas la solution idéale proposée ici par @falsetru.

Mieux vaut parcourir les dict et les enregistrer au format .json en ajoutant une nouvelle ligne.

nos 2 dictionnaires sont

d1 = {'a':1}

d2 = {'b':2}

vous pouvez les écrire à .json

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

et vous pouvez lire le fichier json sans aucun problème

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

simple et efficace

0
murat yalçın

Cela pourrait aider quelqu'un. Je viens de recevoir la même erreur alors que mon fichier JSON est comme ça

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

et je l'ai trouvé mal formé, donc je l'ai changé en une sorte de

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

Une ligne pour votre problème:

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

Si vous voulez le résoudre en deux lignes, vous pouvez le faire comme ceci: 

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