답변:
예, 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.stdin
file
객체를 반환 하므로 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()))
것입니다.
with open()
및 json.loads()
반환 예외 :TypeError: the JSON object must be str, bytes or bytearray, not 'TextIOWrapper'
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
, 파일을위한 loads
A에 대한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')
json.loads(s, *)
- 역 직렬화s
(astr
,bytes
또는bytearray
JSON 문서 함유 인스턴스) - docs.python.org/3.6/library/json.html