Stai leggendo JSON da un file?


320

Mi viene un po 'di mal di testa solo perché un'affermazione semplice e dall'aspetto semplice mi sta dando alcuni errori.

Ho un file json chiamato strings.json in questo modo:

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

Voglio leggere il file json, solo quello per ora. Ho queste affermazioni che ho scoperto, ma non funziona:

import json
from pprint import pprint

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

L'errore visualizzato sulla console era questo:

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]

Modificato

Modificato da json.loadsajson.load

e ottenuto questo:

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
Sei sicuro che il file contenga JSON valido?
Pillole di esplosione il

1
possibile duplicato dei valori
Pureferret,


Il tuo file è un formato json non valido. Modificalo in: {"strings": [{"-name": "city", "#text": "City"}, {"-name": "phone", "#text": "Phone"}, ..., {"-name": "address", "#text": "Address"}]}
krizex il

Risposte:


546

Il json.load()metodo (senza "s" in "caricamento") può leggere direttamente un file:

import json

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

Stavi usando il json.loads()metodo , che è usato solo per argomenti di stringa .

Modifica: il nuovo messaggio è un problema completamente diverso. In tal caso, nel file è presente un codice json non valido. Per questo, consiglierei di eseguire il file tramite un validatore json .

Esistono anche soluzioni per correggere json come ad esempio Come posso riparare automaticamente una stringa JSON non valida? .


2
hm ... sono passato da json.loads a json.load ma ho ricevuto quel bel messaggio.
RRC

5
Ah, beh, il nuovo messaggio è un problema completamente diverso. In tal caso, nel file è presente un codice json non valido. Per questo, consiglierei di eseguire il file tramite un validatore json .
ubomb,

3
fatto! Nel file mancava EOF. Il file non è stato terminato correttamente. Non noterei che se non fosse la tua buona raccomandazione! Grazie!
RRC

1
ubomb, se puoi cambiare mi rispondi per contrassegnarlo come accettato. Sii libero! Lo segnerò.
RRC

Devo aprire il file con byte flag, quindi posso usare il metodo json.load, perché? Ho preso Py3.6
Grzegorz Krug il

113

Ecco una copia del codice che funziona bene per me

import json

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

con i dati

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

potresti voler avvolgere la tua linea json.load con un tentativo try perché JSON non valido causerà un messaggio di errore stacktrace.


41

Il problema si sta utilizzando con l' istruzione:

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

Il file verrà già implicitamente chiuso. Non è necessario chiamare json_data.close()nuovamente.


1
Rimuovere json_data.close (). Come accennato, verrà chiamato implicitamente.
Bonnie Varghese,

1
@Zongjun: correggere i carichi su json.load (json_data).
Knight71,

2
per stampare piuttosto, ho dovuto usare:print(json.dumps(d,sort_keys=True,indent=2))
Mike D

25

In python 3, possiamo usare il metodo seguente.

Leggi da file e converti in 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)

con l' istruzione chiude automaticamente il descrittore di file aperto.


Stringa su JSON

import json
from pprint import pprint

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


1

È possibile utilizzare la libreria Panda per leggere il file JSON.

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

0

Questo funziona per me.

json.load () accetta l'oggetto file, analizza i dati JSON, popola un dizionario Python con i dati e te lo restituisce.

Supponiamo che il file JSON sia così:

{
   "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'}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.