ฉันค้นหาในเอกสารอย่างเป็นทางการนี้เพื่อค้นหาความแตกต่างระหว่าง 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 อีกต่อไป
สำหรับloadvs loadsให้loadถือว่าไฟล์ทั้งหมดเป็นเอกสาร JSON เดียวดังนั้นคุณจึงไม่สามารถใช้เพื่ออ่านเอกสาร JSON แบบ จำกัด ขึ้นบรรทัดใหม่หลายไฟล์จากไฟล์เดียวได้
json.dumps([b'123'])-> TypeError.