Czytasz JSON z pliku?

320

Boli mnie głowa tylko dlatego, że proste, proste stwierdzenie rzuca kilka błędów na moją twarz.

Mam plik json o nazwie strings.json, taki jak ten:

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

Chcę przeczytać plik json, tylko na razie. Mam te stwierdzenia, które znalazłem, ale to nie działa:

import json
from pprint import pprint

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

Błąd wyświetlany na konsoli był następujący:

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]

Edytowane

Zmieniono z json.loadsnajson.load

i dostałem to:

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
źródło
6
Czy jesteś pewien, że plik zawiera prawidłowy JSON?
Tabletki przeciwwybuchowe,
1
możliwy duplikat wartości
parsowania
Zobacz także: Przeczytaj i napisz przykład dla JSON
Martin Thoma
Twój plik ma nieprawidłowy format Json. Zmień na: {"strings": [{"-name": "city", "#text": "City"}, {"-name": "phone", "#text": "Phone"}, ..., {"-name": "address", "#text": "Address"}]}
krizex

Odpowiedzi:

546

json.load()Metoda (bez „s” w „obciążenie”) można odczytać plik bezpośrednio:

import json

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

Użyłeś json.loads()metody , która jest używana tylko dla argumentów łańcuchowych .

Edycja: Nowa wiadomość to zupełnie inny problem. W takim przypadku w pliku znajduje się nieprawidłowy plik Json. W tym celu zaleciłbym uruchomienie pliku za pomocą walidatora json .

Istnieją również rozwiązania do naprawy JSON, takie jak na przykład Jak automatycznie naprawić nieprawidłowy ciąg JSON? .

ubomb
źródło
2
hm ... Zmieniłem z json.loads na json.load, ale dostaję tę fajną wiadomość.
RRC,
5
Ach, cóż, nowa wiadomość to zupełnie inny problem. W takim przypadku w pliku znajduje się nieprawidłowy plik Json. W tym celu zaleciłbym uruchomienie pliku za pomocą walidatora json .
ubomb
3
Rozumiem! W pliku brak EOF. Plik nie został poprawnie zakończony. Nie zauważyłbym tego, gdyby to nie była twoja dobra rekomendacja! Dzięki!
RRC
1
ubomb, jeśli możesz to zmienić, odpowiedz mi, aby oznaczyć je jako zaakceptowane. Bądź wolny! Oznaczę to.
RRC,
Muszę otworzyć plik z flagą bajtów, a następnie mogę użyć metody json.load, dlaczego? Mam Py3.6
Grzegorz Krug,
113

Oto kopia kodu, która działa dobrze dla mnie

import json

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

z danymi

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

możesz owinąć linię json.load próbnym chwytaniem, ponieważ niepoprawny JSON spowoduje komunikat o błędzie śledzenia stosu.

użytkownik1876508
źródło
41

Problem korzysta ze stwierdzeniem:

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

Plik zostanie już domyślnie zamknięty. Nie ma potrzeby dzwonić json_data.close()ponownie.

Zongjun
źródło
1
Usuń json_data.close (). Jak wspomniano, zostanie to nazwane domyślnie.
Bonnie Varghese
1
@Zongjun: Proszę poprawić ładowanie do json.load (json_data).
Knight71
2
do ładnego druku musiałem użyć:print(json.dumps(d,sort_keys=True,indent=2))
Mike D
25

W Pythonie 3 możemy użyć poniższej metody.

Odczyt z pliku i konwersja do 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)

z instrukcją automatycznie zamyka otwarty deskryptor pliku.


Ciąg do JSON

import json
from pprint import pprint

json_data = json.loads('{"name" : "myName", "age":24}')
pprint(json_data)
Thejesh PR
źródło
1

Możesz użyć biblioteki pand do odczytania pliku JSON.

import pandas as pd
df = pd.read_json('strings.json',lines=True)
print(df)
drorhun
źródło
0

To działa dla mnie.

json.load () akceptuje obiekt pliku, analizuje dane JSON, zapełnia dane słownikiem Pythona i zwraca go z powrotem.

Załóżmy, że plik JSON wygląda następująco:

{
   "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
źródło