json.load ()와 json.loads () 함수의 차이점은 무엇입니까?


172

파이썬에서 json.load()와 의 차이점은 무엇 json.loads()입니까?

나는 추측 부하 () 그동안 함수는 파일 객체 (I 컨텍스트 관리자를 사용하는 것이 필요)와 함께 사용되어야 하중 () 함수는 문자열로 파일의 경로를 가져 가라. 약간 혼란 스럽다.

문자 " s "는 문자열json.loads() 을 나타 니까?

답변 주셔서 감사합니다!


1
json.loads(s, *)- 역 직렬화 s(a str, bytes또는 bytearrayJSON 문서 함유 인스턴스) - 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

@Sufiyan Ghori의 답변은이 짧은 그러나 포인트 답변 외에도 훌륭한 예를 제공합니다.
Wlad

65

모든 사람이 설명한 것에 대한 간단한 예를 추가하려고합니다.

json.load ()

json.load파일 자체를 역 직렬화 할 수 있습니다. file예를 들어

# 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() 문자열을 역 직렬화합니다.

따라서 사용하려면 함수를 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()))

제공,

AttributeError : 'str'객체에 'read'속성이 없습니다.

이제 json.load파일 json.loads직렬화를 해제하고 문자열을 직렬화 해제합니다.

다른 예시,

sys.stdinfile객체를 반환 하므로 print(json.load(sys.stdin))실제 json 데이터를 얻습니다.

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
BEST (상세) 답변. (답변) 수락 된 답변과 함께 투표해야합니다. 함께 그들은 강하다 :-)
Wlad

그냥 참고로, 파이썬 3.6.5와 with open()json.loads()반환 예외 :TypeError: the JSON object must be str, bytes or bytearray, not 'TextIOWrapper'
세르지 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 (JSON 문서를 포함하는 .read () 지원 파일과 유사한 객체)를 Python 객체로 역 직렬화합니다.

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

이 변환 테이블을 사용하여 s (JSON 문서를 포함하는 str 또는 유니 코드 인스턴스)를 Python 객체로 역 직렬화합니다.

그래서 load, 파일을위한 loadsA에 대한string


1
"객체와 같은 파일"대 "str / unicode 인스턴스" 무엇이 명확하지 않은지 이해하지 못합니까?
RvdK

7

빠른 답변 (매우 단순화되었습니다!)

json.load ()는 파일을 가져옵니다

json.load ()는 파일 (파일 객체)을 예상합니다 'files/example.json'.


json.loads ()는 STRING을 사용합니다.

json.loads ()는 (유효한) JSON 문자열을 예상합니다. 즉 {"foo": "bar"}


실시 예

이 컨텐츠를 가진 example.json 파일이 있다고 가정하면 { "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/…
Wlad

1

json.load () ( "로드"의 "S"가없는) 방법은 파일을 직접 읽을 수 있습니다 :

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

여기에서 loads ()를 사용하여 문자열 (type (str))을 입력 및 반환 사전으로 사용하면 볼 수 있습니다.


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바이트 된 ByteArray, 그것은 먼저 문자열로 디코딩됩니다. 소스 코드에서도 찾을 수 있습니다.

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')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.