ในการรับไฟล์utf8 -encodedเมื่อเทียบกับascii -encodedในคำตอบที่ยอมรับสำหรับ Python 2 ให้ใช้:
import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False))
รหัสนั้นง่ายกว่าใน Python 3:
import json
with open('data.txt', 'w') as f:
json.dump(data, f, ensure_ascii=False)
บน Windows encoding='utf-8'
อาร์กิวเมนต์open
ยังคงจำเป็น
เพื่อหลีกเลี่ยงการจัดเก็บสำเนาข้อมูลที่เข้ารหัสในหน่วยความจำ (ผลลัพธ์dumps
) และเพื่อทดสอบผลลัพธ์utf8-encodedทั้งใน Python 2 และ 3 ให้ใช้:
import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)
การcodecs.getwriter
โทรซ้ำซ้อนใน Python 3 แต่จำเป็นสำหรับ Python 2
การอ่านและขนาด:
การใช้ensure_ascii=False
ช่วยให้อ่านง่ายขึ้นและมีขนาดเล็กลง:
>>> json.dumps({'price': '€10'})
'{"price": "\\u20ac10"}'
>>> json.dumps({'price': '€10'}, ensure_ascii=False)
'{"price": "€10"}'
>>> len(json.dumps({'абвгд': 1}))
37
>>> len(json.dumps({'абвгд': 1}, ensure_ascii=False).encode('utf8'))
17
เพิ่มเติมปรับปรุงให้สามารถอ่านได้โดยการเพิ่มธงindent=4, sort_keys=True
(แนะนำโดยdinos66 ) เพื่อการขัดแย้งของหรือdump
dumps
วิธีนี้คุณจะได้รับโครงสร้างเรียงลำดับที่เยื้องเข้าไปอย่างมากในไฟล์ json โดยมีขนาดไฟล์ใหญ่ขึ้นเล็กน้อย