Json.load () और json.loads () फ़ंक्शन के बीच अंतर क्या है


173

अजगर में, के बीच अंतर क्या है json.load()और json.loads()?

मुझे लगता है कि लोड () फ़ंक्शन को एक फ़ाइल ऑब्जेक्ट के साथ उपयोग किया जाना चाहिए (मुझे इस प्रकार एक संदर्भ प्रबंधक का उपयोग करने की आवश्यकता है) जबकि लोड () फ़ंक्शन एक स्ट्रिंग के रूप में फ़ाइल के लिए पथ लेता है। यह थोड़ा भ्रमित करने वाला है।

क्या पत्र " एस " स्ट्रिंग केjson.loads() लिए स्टैंड में है ?

आपके उत्तरों के लिए बहुत धन्यवाद!


1
json.loads(s, *)- deserialize s(एक str, bytesया bytearrayउदाहरण के लिए एक JSON दस्तावेज़ युक्त) - docs.python.org/3.6/library/json.html
deceze

जवाबों:


160

हाँ, sस्ट्रिंग के लिए खड़ा है। json.loadsसमारोह फ़ाइल पथ, लेकिन एक स्ट्रिंग के रूप में फ़ाइल की सामग्री नहीं ले करता है। दस्तावेज़ीकरण https://docs.python.org/2/library/json.html पर देखें !


5
लिंक किया गया लेख गलत अजगर संस्करण की ओर इशारा करता है। प्रश्न 2.7 के रूप में टैग किया गया है।
RvdK

@ सूफियान घोरी का उत्तर इस संक्षिप्त लेकिन बिंदु उत्तर के अलावा अच्छे उदाहरण प्रदान करता है।
व्लाद

65

बस एक सरल उदाहरण जोड़ने जा रहा है कि सभी ने क्या समझाया है,

json.load ()

json.loadfileउदाहरण के लिए, किसी फ़ाइल को स्वयं सत्यापित कर सकता है अर्थात यह एक वस्तु को स्वीकार करता है ,

# 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))

उत्पादन होगा,

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

अगर मैं json.loadsइसके बजाय एक फ़ाइल खोलने के लिए उपयोग करता हूं ,

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

मुझे यह त्रुटि मिलेगी:

TypeError: अपेक्षित स्ट्रिंग या बफर

json.loads ()

json.loads() deserialize string।

इसलिए उपयोग करने के लिए json.loadsमुझे read()फ़ंक्शन का उपयोग करके फ़ाइल की सामग्री को पास करना होगा , उदाहरण के लिए,

फ़ाइल की वापसी सामग्री के content.read()साथ उपयोग करना json.loads(),

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

आउटपुट,

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

ऐसा इसलिए है क्योंकि content.read()स्ट्रिंग का प्रकार है, यानी<type 'str'>

अगर मैं उपयोग json.load()करता content.read()हूं, तो मुझे त्रुटि मिलेगी,

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

देता है,

गुण: 'str' ऑब्जेक्ट में कोई विशेषता नहीं है 'पढ़ा'

तो, अब आप json.loaddeserialze फ़ाइल को जानते हैं और json.loadsएक स्ट्रिंग को deserialize करते हैं।

एक और उदाहरण,

sys.stdinवापसी fileवस्तु, इसलिए यदि मैं करता print(json.load(sys.stdin))हूं, तो मुझे वास्तविक जोंस डेटा मिलेगा,

cat json_data.json | ./test.py

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

यदि मैं उपयोग करना चाहता हूं json.loads(), तो मैं print(json.loads(sys.stdin.read()))इसके बजाय करूंगा ।


4
सबसे अच्छा (विस्तृत) उत्तर। (लघु) स्वीकृत उत्तर के साथ वोट करने के लिए अप-वोट किया जाना चाहिए। साथ में वे मज़बूत होते हैं :-)
व्लाद

सिर्फ FYI करें, Python 3.6.5 के साथ with open()और json.loads()एक अपवाद देता है:TypeError: the JSON object must be str, bytes or bytearray, not 'TextIOWrapper'
Sergiy Kolodyazhnyy

30

प्रलेखन काफी स्पष्ट है: 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]]]]]]]])

इस रूपांतरण तालिका का उपयोग करके पायथन ऑब्जेक्ट के लिए fp (एक .read () - JSON दस्तावेज़ युक्त सहायक फ़ाइल) का वर्णन करें।

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

इस रूपांतरण तालिका का उपयोग करते हुए पायथन ऑब्जेक्ट में Deserialize s (एक JSON दस्तावेज़ वाला एक str या यूनिकोड उदाहरण)।

तो loadएक फ़ाइल के loadsलिए है , एक के लिएstring


1
"फ़ाइल जैसा ऑब्जेक्ट" बनाम "एक स्ट्र / यूनिकोड उदाहरण"। मुझे समझ नहीं आया कि क्या स्पष्ट नहीं है?
RvdK

7

क्विक ANSWER (बहुत सरलीकृत!)

json.load () एक फ़ाइल लेता है

json.load () एक फ़ाइल (फ़ाइल ऑब्जेक्ट) की अपेक्षा करता है - जैसे कि फ़ाइल फ़ाइल द्वारा दी गई फ़ाइल को फ़ाइलपथ द्वारा दिए जाने से पहले 'files/example.json'


json.loads () एक STRING लेता है

json.loads () को उम्मीद है कि (वैध) JSON स्ट्रिंग - यानी {"foo": "bar"}


उदाहरण

मान लें कि आपके पास एक फ़ाइल उदाहरण है। इस सामग्री के साथ: {"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'

ट्यूटोरियल के बारे में json.dump/ dumps& json.load/ loads bogotobogo.com/python/…
व्लाद

1

Json.load () विधि (बिना "एस" "लोड" में) एक फ़ाइल को सीधे पढ़ सकते हैं:

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

json.loads () विधि, जिसका उपयोग केवल स्ट्रिंग तर्कों के लिए किया जाता है ।

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'>

यहाँ, हम भार उपयोग करने के बाद देख सकते हैं () एक लेता स्ट्रिंग एक इनपुट और वापसी के रूप में (प्रकार (एसटीआर)) शब्दकोश


0

Python3.7.7 में, json.load की परिभाषा cpython स्रोत कोड के अनुसार नीचे है :

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 वास्तव में json.loads कहता है और fp.read()पहले तर्क के रूप में उपयोग करता है।

तो अगर आपका कोड है:

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

यह ऐसा करने के लिए समान है:

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

लेकिन अगर आपको फ़ाइल से पढ़ने वाले बाइट्स को इस प्रकार निर्दिष्ट करने की आवश्यकता है fp.read(10) या आप जिस स्ट्रिंग / बाइट्स को डिस्क्रिअलाइज़ करना चाहते हैं वह फ़ाइल से नहीं है, तो आपको json.loads () का उपयोग करना चाहिए

Json.loads () के लिए, यह न केवल स्ट्रिंग को अपवित्र करता है, बल्कि बाइट भी करता है। यदि sबाइट्स या बायटेरियर है, तो इसे पहले स्ट्रिंग में डिकोड किया जाएगा। आप इसे सोर्स कोड में भी पा सकते हैं।

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')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.