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


131

파이썬에서 json.dump ()와 json.dumps ()의 차이점을 찾기 위해이 공식 문서를 검색했습니다 . 파일 쓰기 옵션과 관련이 있음이 분명합니다.
그러나 그들 사이의 자세한 차이점은 무엇이며 어떤 상황에서 다른 것보다 더 많은 이점이 있습니까?

답변:


146

문서에서 말한 것 외에 추가 할 것이 많지 않습니다. JSON을 파일 / 소켓 등으로 덤프하려면을 사용하십시오 dump(). 문자열로만 필요한 경우 (인쇄, 파싱 등) dumps()(덤프 문자열)을 사용하십시오

이 답변에서 Antii Haapala가 언급했듯이 ensure_ascii행동 에는 약간의 차이가 있습니다. 이것은 주로 기본 write()함수가 작동 하는 방식 때문이며 전체 문자열이 아닌 청크에서 작동하기 때문입니다. 이에 대한 자세한 내용은 그의 대답을 확인하십시오.

json.dump()

obj를 JSON 형식의 스트림으로 fp (.write () 지원 파일과 유사한 객체)로 직렬화

ensure_ascii가 False 인 경우 fp에 기록 된 일부 청크는 유니 코드 인스턴스 일 수 있습니다.

json.dumps()

obj를 JSON 형식의 str로 직렬화

ensure_ascii가 False이면 결과에 ASCII가 아닌 문자가 포함될 수 있으며 반환 값은 유니 코드 인스턴스 일 수 있습니다.


dump ()를 사용하여 소켓을 통해 보내는 방법에 대한 예를 보여줄 수 있습니까? 바이트로 변환하기 위해 dumps () 및 encode ()를 사용할 수 있지만 더 짧은 방법이 있습니까?
Boy


20

메모리 사용 및 속도

jsonstr = json.dumps(mydata)처음 호출 하면 메모리에 데이터의 전체 사본이 작성되고 그 후에 만 file.write(jsonstr)디스크에 작성됩니다. 따라서 이것은 더 빠른 방법이지만 저장할 데이터가 많은 경우 문제가 될 수 있습니다.

json.dump(mydata, file)'s'없이- 를 호출 하면 데이터가 청크에 의해 덤프되므로 새 메모리가 사용되지 않습니다. 그러나 전체 프로세스는 약 2 배 느립니다.

출처 : 나는의 소스 코드를 확인 json.dump()하고 json.dumps(), 또한 모두가 함께 시간을 측정 변형 테스트 time.time()와 htop의 메모리 사용량을보고.


6

에서 주목할만한 차이 파이썬 2는 당신이 사용하는 경우이다 ensure_ascii=False, dump(당신이 UTF-8없는 확장 문자와 8 비트 문자열을 사용하지 않는 한) 파일에 제대로 쓰기 UTF-8 인코딩 된 데이터를 것입니다 :

dumps다른 한편으로 ensure_ascii=False를 생성 할 수 있습니다 str또는 unicode당신이 문자열을 사용하는 어떤 종류에 따라 :

이 변환 표를 사용하여 obj를 JSON 형식의 str로 직렬화하십시오. ensure_ascii가 False이면 결과에 ASCII가 아닌 문자가 포함될 수 있으며unicode 반환 값 인스턴스 일 수 있습니다 .

(강조 광산). 여전히 str인스턴스 일 수도 있습니다.

따라서 어떤 형식이 반환되었는지 확인하지 않고을 (를) 사용하지 않고 반환 값을 사용하여 구조를 파일에 저장할 수 없습니다 unicode.encode.

물론 이것은 8 비트 / 유니 코드 혼동이 더 이상 없기 때문에 파이썬 3에서는 더 이상 유효하지 않습니다.


에 관해서는 loadloads, load고려 전체 는 하나의 파일에서 여러 줄 바꿈 제한 JSON 문서를 읽고 사용할 수 없도록 한 JSON 문서가 될 파일을.


파이썬 문자열 객체에서 생성 된 모든 텍스트는 유니 코드이지만 일반적으로 가정하는 것이 안전합니까? 즉 파일에서 내용을로드 할 때?
João Gonçalves

@ JoãoGonçalves 그것은 바이너리 데이터를 텍스트와 혼합하여 파이썬이 자동으로 승인 할 수 없다는 것을 의미합니다. 예 : json.dumps([b'123'])-> TypeError.
Antti Haapala

@ JoãoGonçalves 또한 JSON 문서의 문자열이주의 할 유니 코드해야 하고, 해야 , UTF-16, UTF-32는 RFC 7159에 따라 UTF-8의의를
안티 Haapala

1
그 설명에 감사드립니다! 말이됩니다
João Gonçalves
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.