W Pythonie, jaka jest różnica między json.load()
i json.loads()
?
Myślę, że obciążenie () funkcja musi być używany z obiektu pliku (Muszę zatem, aby użyć menedżera kontekstowe), natomiast () ładuje funkcyjne wziąć ścieżkę do pliku jako ciąg znaków. To trochę zagmatwane.
Czy litera „ s ” json.loads()
oznacza ciąg ?
Wielkie dzięki za odpowiedzi!
python
json
python-2.7
MMF
źródło
źródło
json.loads(s, *)
- Cofnięcies
(astr
,bytes
lubbytearray
przykład zawierającego dokument JSON) - docs.python.org/3.6/library/json.htmlOdpowiedzi:
Tak,
s
oznacza string.json.loads
Funkcja nie bierze ścieżkę pliku, ale zawartość pliku jako ciąg. Zajrzyj do dokumentacji na https://docs.python.org/2/library/json.html !źródło
Dodam tylko prosty przykład do tego, co wszyscy wyjaśnili,
json.load ()
json.load
może sam deserializować plik, tzn. akceptujefile
obiekt, na przykładwyjdzie,
Jeśli
json.loads
zamiast tego użyję do otwarcia pliku,Otrzymałbym ten błąd:
json.loads ()
json.loads()
ciąg deserializacji.Żeby więc skorzystać
json.loads
będę musiał przekazać zawartość pliku za pomocąread()
funkcji np.korzystanie
content.read()
zejson.loads()
zwrotem zawartości pliku,Wynik,
Dzieje się tak, ponieważ typ
content.read()
to string, tj<type 'str'>
Jeśli używam
json.load()
zcontent.read()
, otrzymam błąd,Daje,
Więc teraz znasz
json.load
plikjson.loads
deserialze i deserializujesz ciąg.Inny przykład,
sys.stdin
zwracafile
obiekt, więc jeśli to zrobięprint(json.load(sys.stdin))
, otrzymam aktualne dane json,Jeśli chcę użyć
json.loads()
, zrobiłbym toprint(json.loads(sys.stdin.read()))
zamiast tego.źródło
with open()
ijson.loads()
zwraca wyjątek:TypeError: the JSON object must be str, bytes or bytearray, not 'TextIOWrapper'
Dokumentacja jest dość przejrzysta: https://docs.python.org/2/library/json.html
Tak
load
jest w przypadku pliku,loads
astring
źródło
SZYBKA ODPOWIEDŹ (bardzo uproszczona!)
PRZYKŁADY
źródło
json.dump
/dumps
&json.load
/loads
bogotobogo.com/python/ ...Metoda json.load () (bez „s” w „load”) może bezpośrednio odczytać plik:
json.loads () , która jest używana tylko dla argumentów łańcuchowych .
Tutaj widzimy, że po użyciu load () przyjmuje ciąg znaków (type (str)) jako słownik wejściowy i zwrotny .
źródło
W pythonie3.7.7 definicja json.load jest następująca, zgodnie z kodem źródłowym cpython :
json.load faktycznie wywołuje json.loads i używa go
fp.read()
jako pierwszego argumentu.Więc jeśli twój kod to:
Robi się to tak samo:
Ale jeśli chcesz określić bajty odczytywane z pliku jako podobne
fp.read(10)
lub ciąg / bajty, które chcesz deserializować, nie pochodzą z pliku, powinieneś użyć json.loads ()Jeśli chodzi o json.loads (), nie tylko deserializuje ciąg, ale także bajty. Jeśli
s
to bajty lub bytearray, zostanie najpierw zdekodowany na łańcuch. Możesz go również znaleźć w kodzie źródłowym.źródło