Vous lisez JSON à partir d'un fichier?


320

Je reçois un peu de maux de tête juste parce qu'une déclaration simple et facile me jette quelques erreurs au visage.

J'ai un fichier json appelé strings.json comme ceci:

"strings": [{"-name": "city", "#text": "City"}, {"-name": "phone", "#text": "Phone"}, ...,
            {"-name": "address", "#text": "Address"}]

Je veux lire le fichier json, juste pour l'instant. J'ai ces déclarations que j'ai découvert, mais cela ne fonctionne pas:

import json
from pprint import pprint

with open('strings.json') as json_data:
    d = json.loads(json_data)
    json_data.close()
    pprint(d)

L'erreur affichée sur la console était la suivante:

Traceback (most recent call last):
  File "/home/.../android/values/manipulate_json.py", line 5, in <module>
    d = json.loads(json_data)
  File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer
[Finished in 0.1s with exit code 1]

Édité

Modifié de json.loadsàjson.load

et j'ai obtenu ceci:

Traceback (most recent call last):
  File "/home/.../android/values/manipulate_json.py", line 5, in <module>
    d = json.load(json_data)
  File "/usr/lib/python2.7/json/__init__.py", line 278, in load
    **kw)
  File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 369, in decode
    raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 829 column 1 - line 829 column 2 (char 18476 - 18477)
[Finished in 0.1s with exit code 1]

6
Êtes-vous sûr que le fichier contient du JSON valide?
Pilules d'explosion



Votre fichier est au format json non valide. Changez-le en: {"strings": [{"-name": "city", "#text": "City"}, {"-name": "phone", "#text": "Phone"}, ..., {"-name": "address", "#text": "Address"}]}
krizex

Réponses:


546

La json.load()méthode (sans "s" dans "load") permet de lire directement un fichier:

import json

with open('strings.json') as f:
    d = json.load(f)
    print(d)

Vous utilisiez la json.loads()méthode , qui est utilisée uniquement pour les arguments de chaîne .

Edit: Le nouveau message est un problème totalement différent. Dans ce cas, il y a du json invalide dans ce fichier. Pour cela, je recommanderais d'exécuter le fichier via un validateur json .

Il existe également des solutions pour corriger json comme par exemple Comment réparer automatiquement une chaîne JSON invalide? .


2
hm ... J'ai changé de json.loads en json.load mais j'obtiens ce joli msg.
RRC

5
Ah, eh bien le nouveau message est un problème totalement différent. Dans ce cas, il y a du json invalide dans ce fichier. Pour cela, je recommanderais d'exécuter le fichier via un validateur json .
ubomb

3
je l'ai! Le fichier manquait EOF. Le fichier ne s'est pas terminé correctement. Je ne remarquerais pas que si ce n'était pas votre bonne recommandation! Merci!
RRC

1
ubomb, si vous pouvez changer, répondez-moi pour le marquer comme accepté. Sois libre! Je vais le marquer.
RRC

Je dois ouvrir un fichier avec un indicateur d'octet, puis je peux utiliser la méthode json.load, pourquoi? J'ai eu Py3.6
Grzegorz Krug le

113

Voici une copie du code qui fonctionne bien pour moi

import json

with open("test.json") as json_file:
    json_data = json.load(json_file)
    print(json_data)

avec les données

{
    "a": [1,3,"asdf",true],
    "b": {
        "Hello": "world"
    }
}

vous souhaiterez peut-être encapsuler votre ligne json.load avec un try catch car un JSON non valide provoquera un message d'erreur stacktrace.


41

Le problème utilise avec l' instruction:

with open('strings.json') as json_data:
    d = json.load(json_data)
    pprint(d)

Le dossier va déjà être implicitement fermé. Il n'est pas nécessaire de rappeler json_data.close().


1
Veuillez supprimer json_data.close (). Comme mentionné, il sera appelé implicitement.
Bonnie Varghese

1
@Zongjun: Veuillez corriger les charges dans json.load (json_data).
Knight71

2
pour joliment imprimer, j'ai dû utiliser:print(json.dumps(d,sort_keys=True,indent=2))
Mike D

25

En python 3, nous pouvons utiliser la méthode ci-dessous.

Lire à partir d'un fichier et convertir en JSON

import json
from pprint import pprint

# Considering "json_list.json" is a json file

with open('json_list.json') as fd:
     json_data = json.load(fd)
     pprint(json_data)

avec l' instruction ferme automatiquement le descripteur de fichier ouvert.


Chaîne en JSON

import json
from pprint import pprint

json_data = json.loads('{"name" : "myName", "age":24}')
pprint(json_data)


1

Vous pouvez utiliser la bibliothèque pandas pour lire le fichier JSON.

import pandas as pd
df = pd.read_json('strings.json',lines=True)
print(df)

0

Cela fonctionne pour moi.

json.load () accepte l'objet fichier, analyse les données JSON, remplit un dictionnaire Python avec les données et vous le renvoie.

Supposons que le fichier JSON ressemble à ceci:

{
   "emp_details":[
                 {
                "emp_name":"John",
                "emp_emailId":"john@gmail.com"  
                  },
                {
                 "emp_name":"Aditya",
                 "emp_emailId":"adityatest@yahoo.com"
                }
              ] 
}

import json 

# Opening JSON file 
f = open('data.json',) 

# returns JSON object as  
# a dictionary 
data = json.load(f) 

# Iterating through the json 
# list 
for i in data['emp_details']: 
    print(i) 

# Closing file 
f.close()

#Output:
{'emp_name':'John','emp_emailId':'john@gmail.com'}
{'emp_name':'Aditya','emp_emailId':'adityatest@yahoo.com'}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.