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

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

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

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

답변 주셔서 감사합니다!



답변

예, s문자열을 나타냅니다. 이 json.loads함수는 파일 경로를 사용하지 않고 파일 내용을 문자열로 사용합니다. https://docs.python.org/2/library/json.html 의 설명서를보십시오 !


답변

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

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()))것입니다.


답변

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


답변

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

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.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))을 입력 및 반환 사전으로 사용하면 볼 수 있습니다.


답변

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


답변