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]
RRC
la source
6
Êtes-vous sûr que le fichier contient du JSON valide?
Pilules d'explosion
1
duplication possible de valeurs d'analyse à partir d'un fichier JSON en Python
Pureferret
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? .

ubomb
la source
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.

user1876508
la source
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().

Zongjun
la source
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)
Thejesh PR
la source
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)
drorhun
la source
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":"[email protected]"  
                  },
                {
                 "emp_name":"Aditya",
                 "emp_emailId":"[email protected]"
                }
              ] 
}

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':'[email protected]'}
{'emp_name':'Aditya','emp_emailId':'[email protected]'}
Aditya patil
la source