Json.load () ve json.loads () işlevleri arasındaki fark nedir


173

Python'da json.load()ve arasındaki fark json.loads()nedir?

Load () işlevi bir dosya nesnesi ile kullanılmalıdır sanırım (bu yüzden bir bağlam yöneticisi kullanmak gerekir) loads () işlevi bir dize olarak dosyaya yol alır. Biraz kafa karıştırıcı.

Harfi "Does s in" json.loads()için standı dize ?

Cevaplarınız için çok teşekkürler!


1
json.loads(s, *)- Deserialize s(a str, bytesya da bytearraybir JSON belgesini içeren örneği) - docs.python.org/3.6/library/json.html
deceze

Yanıtlar:


160

Evet, sdize anlamına gelir. json.loadsFonksiyon dosya yolu, ama bir dize olarak dosya içeriğini almaz. Https://docs.python.org/2/library/json.html adresindeki belgelere bakın !


5
Bağlantılı makale yanlış python sürümüne işaret ediyor. Soru 2.7 olarak etiketlendi.
RvdK

@Sufiyan Ghori'nin cevabı bu kısa ama puan cevabına ek olarak güzel örnekler sunuyor.
wlad

65

Herkesin açıkladığı şeye basit bir örnek ekleyeceğiz,

json.load ()

json.loadfileörneğin, bir dosyanın kendisinin serisini kaldırabilir , örneğin bir nesneyi kabul eder ,

# open a json file for reading and print content using json.load
with open("/xyz/json_data.json", "r") as content:
  print(json.load(content))

çıktı olacak,

{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}

Ben kullanırsanız json.loadsyerine dosyayı açmak için,

# you cannot use json.loads on file object
with open("json_data.json", "r") as content:
  print(json.loads(content))

Bu hatayı alırdım:

TypeError: beklenen dize veya arabellek

json.loads ()

json.loads() dizinin serisini kaldır.

Bu nedenle kullanmak json.loadsiçin dosyanın içeriğini read()örneğin işlevini kullanarak geçirmem gerekecek.

dosyanın iade içeriği content.read()ile kullanmak json.loads(),

with open("json_data.json", "r") as content:
  print(json.loads(content.read()))

Çıktı,

{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}

Çünkü content.read()dize türü , yani<type 'str'>

Ben kullanırsanız json.load()ile content.read(), ben hata alacaksınız,

with open("json_data.json", "r") as content:
  print(json.load(content.read()))

, verir

AttributeError: 'str' nesnesinin 'read' özelliği yok

Şimdi, json.loaddeserialze dosyasını biliyorsunuz ve json.loadsbir dizgenin serisini kaldırıyorsunuz.

Başka bir örnek,

sys.stdindönmek filebenim yaptığım eğer öyleyse, nesneyi print(json.load(sys.stdin)), ben gerçek json verileri alacak

cat json_data.json | ./test.py

{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}

Kullanmak istersem onun yerine json.loads()yapardım print(json.loads(sys.stdin.read())).


4
EN İYİ (ayrıntılı) cevap. (Kısa) kabul edilen cevaba eşlik edecek şekilde oylanmalıdır. Birlikte :-) güçlü
wlad

Sadece FYI, Python 3.6.5 ile with open()ve json.loads()bir istisna döndürür:TypeError: the JSON object must be str, bytes or bytearray, not 'TextIOWrapper'
Sergiy Kolodyazhnyy

31

Belgeler oldukça açık: https://docs.python.org/2/library/json.html

json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

Bu dönüşüm tablosunu kullanarak bir Python nesnesine fp (a .read () - bir JSON belgesi içeren dosya benzeri nesnenin desteklenmesi).

json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

Bu dönüştürme tablosunu kullanarak s'nin (JSON belgesi içeren bir str veya unicode örneği) Python nesnesine serisini kaldırın.

Yani loadbir dosya loadsiçin,string


1
"Dosya benzeri nesne" ve "str / unicode örneği". Neyin net olmadığını anlamıyorum?
RvdK

7

HIZLI CEVAP (çok basitleştirilmiş!)

json.load () bir DOSYA alır

json.load () bir dosya (dosya nesnesi) bekler - örneğin dosya yolu tarafından daha önce açılmış bir dosya 'files/example.json'.


json.loads () bir STRING alır

json.loads (), (geçerli) bir JSON dizesi bekler - ie {"foo": "bar"}


ÖRNEKLER

Şu içeriğe sahip bir example.json dosyanız olduğunu varsayarsak : {"key_1": 1, "key_2": "foo", "Key_3": null}

>>> import json
>>> file = open("example.json")

>>> type(file)
<class '_io.TextIOWrapper'>

>>> file
<_io.TextIOWrapper name='example.json' mode='r' encoding='UTF-8'>

>>> json.load(file)
{'key_1': 1, 'key_2': 'foo', 'Key_3': None}

>>> json.loads(file)
Traceback (most recent call last):
  File "/usr/local/python/Versions/3.7/lib/python3.7/json/__init__.py", line 341, in loads
TypeError: the JSON object must be str, bytes or bytearray, not TextIOWrapper


>>> string = '{"foo": "bar"}'

>>> type(string)
<class 'str'>

>>> string
'{"foo": "bar"}'

>>> json.loads(string)
{'foo': 'bar'}

>>> json.load(string)
Traceback (most recent call last):
  File "/usr/local/python/Versions/3.7/lib/python3.7/json/__init__.py", line 293, in load
    return loads(fp.read(),
AttributeError: 'str' object has no attribute 'read'

Eğitimi hakkında json.dump/ dumps& json.load/ loads bogotobogo.com/python/...
wlad

1

Json.load () ( "yük" in "s") olmadan yöntem bir dosyayı, doğrudan okuyabilir:

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

Yalnızca dize bağımsız değişkenleri için kullanılan json.loads () yöntemi .

import json

person = '{"name": "Bob", "languages": ["English", "Fench"]}'
print(type(person))
# Output : <type 'str'>

person_dict = json.loads(person)
print( person_dict)
# Output: {'name': 'Bob', 'languages': ['English', 'Fench']}

print(type(person_dict))
# Output : <type 'dict'>

Burada, loads () kullandıktan sonra girdi ve dönüş sözlüğü olarak bir dize (type (str)) aldığını görebiliriz .


0

Python3.7.7'de, json.load tanımı cpython kaynak koduna göre aşağıdaki gibidir :

def load(fp, *, cls=None, object_hook=None, parse_float=None,
        parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):

    return loads(fp.read(),
        cls=cls, object_hook=object_hook,
        parse_float=parse_float, parse_int=parse_int,
        parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)

json.load aslında json.loads'ı çağırır ve fp.read()ilk argüman olarak kullanır .

Kodunuz:

with open (file) as fp:
    s = fp.read()
    json.loads(s)

Bunu yapmak için de aynı şey geçerlidir:

with open (file) as fp:
    json.load(fp)

Ancak, dosyadan okunan fp.read(10)baytları istediğiniz gibi belirtmeniz gerekiyorsa veya serisini kaldırmak istediğiniz dizge / bayt dosyadan değilse, json.loads () kullanmanız gerekir.

Json.loads () 'a gelince, sadece dizginin serisini kaldırmaz aynı zamanda baytları da diziselleştirir. Eğer sbayt veya ByteArray, o ilk dize deşifre edilecektir. Ayrıca kaynak kodunda da bulabilirsiniz.

def loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None,
        parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
    """Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance
    containing a JSON document) to a Python object.

    ...

    """
    if isinstance(s, str):
        if s.startswith('\ufeff'):
            raise JSONDecodeError("Unexpected UTF-8 BOM (decode using utf-8-sig)",
                                  s, 0)
    else:
        if not isinstance(s, (bytes, bytearray)):
            raise TypeError(f'the JSON object must be str, bytes or bytearray, '
                            f'not {s.__class__.__name__}')
        s = s.decode(detect_encoding(s), 'surrogatepass')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.