ฉันค้นหาในเอกสารอย่างเป็นทางการนี้เพื่อค้นหาความแตกต่างระหว่าง json.dump () และ json.dumps () ใน python เป็นที่ชัดเจนว่าเกี่ยวข้องกับตัวเลือกการเขียนไฟล์
แต่อะไรคือความแตกต่างโดยละเอียดระหว่างพวกเขาและในสถานการณ์ใดที่มีข้อได้เปรียบมากกว่าที่อื่น?
ฉันค้นหาในเอกสารอย่างเป็นทางการนี้เพื่อค้นหาความแตกต่างระหว่าง json.dump () และ json.dumps () ใน python เป็นที่ชัดเจนว่าเกี่ยวข้องกับตัวเลือกการเขียนไฟล์
แต่อะไรคือความแตกต่างโดยละเอียดระหว่างพวกเขาและในสถานการณ์ใดที่มีข้อได้เปรียบมากกว่าที่อื่น?
คำตอบ:
ไม่มีอะไรให้เพิ่มเติมนอกเหนือจากสิ่งที่เอกสารกล่าว ถ้าคุณต้องการที่จะถ่ายโอนข้อมูล JSON เป็นไฟล์ / dump()
ซ็อกเก็ตหรืออะไรก็ตามแล้วคุณควรไปด้วย หากคุณต้องการเป็นสตริงเท่านั้น (สำหรับการพิมพ์การแยกวิเคราะห์หรืออะไรก็ตาม) ให้ใช้dumps()
(สตริงการถ่ายโอนข้อมูล)
ตามที่กล่าวโดยAntii Haapala ในคำตอบนี้มีความแตกต่างเล็กน้อยเกี่ยวกับensure_ascii
พฤติกรรม ส่วนใหญ่เกิดจากการwrite()
ทำงานของฟังก์ชันพื้นฐานเนื่องจากมันทำงานเป็นกลุ่มแทนที่จะเป็นสตริงทั้งหมด ตรวจสอบคำตอบของเขาสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนั้น
json.dump()
อนุกรม obj เป็นสตรีมที่จัดรูปแบบ JSON เป็น fp (a .write () - รองรับออบเจ็กต์ที่เหมือนไฟล์
หาก sure_ascii เป็น False บางส่วนที่เขียนถึง fp อาจเป็นอินสแตนซ์ยูนิโคด
json.dumps()
ทำให้ obj เป็นอนุกรมกับ str ที่จัดรูปแบบ JSON
หาก sure_ascii เป็น False ผลลัพธ์อาจมีอักขระที่ไม่ใช่ ASCII และค่าที่ส่งคืนอาจเป็นอินสแตนซ์ Unicode
ฟังก์ชันที่มีs
พารามิเตอร์ take string คนอื่น ๆ ใช้สตรีมไฟล์
ในการใช้หน่วยความจำและความเร็ว
เมื่อคุณเรียกjsonstr = json.dumps(mydata)
มันครั้งแรกจะสร้างสำเนาข้อมูลทั้งหมดของคุณในหน่วยความจำจากนั้นคุณfile.write(jsonstr)
จะส่งไปยังดิสก์เท่านั้น ดังนั้นนี่เป็นวิธีที่เร็วกว่า แต่อาจเป็นปัญหาได้หากคุณมีข้อมูลจำนวนมากที่จะบันทึก
เมื่อคุณโทรjson.dump(mydata, file)
- โดยไม่มี 's' หน่วยความจำใหม่จะไม่ถูกใช้เนื่องจากข้อมูลจะถูกทิ้งเป็นชิ้น ๆ แต่กระบวนการทั้งหมดช้าลงประมาณ 2 เท่า
ที่มา: ฉันตรวจสอบซอร์สโค้ดของjson.dump()
และjson.dumps()
และทดสอบทั้งสองตัวแปรที่วัดเวลาด้วยtime.time()
และดูการใช้หน่วยความจำใน htop
หนึ่งความแตกต่างที่โดดเด่นในหลาม 2คือว่าถ้าคุณกำลังใช้ensure_ascii=False
, dump
จะ UTF-8 เข้ารหัสข้อมูลอย่างถูกต้องเขียนลงในแฟ้ม (เว้นแต่คุณจะใช้สาย 8 บิตที่มีอักขระที่ขยายที่ไม่ UTF-8):
dumps
ในทางกลับกันensure_ascii=False
สามารถสร้างstr
หรือunicode
ขึ้นอยู่กับประเภทที่คุณใช้สำหรับสตริง:
ทำให้อนุกรม obj เป็น str ที่จัดรูปแบบ JSON โดยใช้ตารางการแปลงนี้ หาก ensure_ascii คือ False ผลที่อาจประกอบด้วยอักขระที่ไม่ใช่ ASCII และค่าตอบแทนอาจจะเป็น
unicode
ตัวอย่าง
(เน้นของฉัน) โปรดทราบว่าอาจยังคงเป็นstr
อินสแตนซ์ได้เช่นกัน
unicode.encode
ดังนั้นคุณจะไม่สามารถใช้ค่าตอบแทนเพื่อประหยัดโครงสร้างลงในแฟ้มโดยไม่ตรวจสอบรูปแบบที่ถูกส่งกลับและอาจจะเล่นกับ
แน่นอนว่านี่ไม่ใช่ข้อกังวลที่ถูกต้องใน Python 3 อีกต่อไปเนื่องจากไม่มีความสับสน 8 บิต / Unicode อีกต่อไป
สำหรับload
vs loads
ให้load
ถือว่าไฟล์ทั้งหมดเป็นเอกสาร JSON เดียวดังนั้นคุณจึงไม่สามารถใช้เพื่ออ่านเอกสาร JSON แบบ จำกัด ขึ้นบรรทัดใหม่หลายไฟล์จากไฟล์เดียวได้
json.dumps([b'123'])
-> TypeError
.