Để có được utf8 -encoded tập tin như trái ngược với ascii -encoded trong câu trả lời được chấp nhận cho Python 2 sử dụng:
import io, json
with io.open('data.txt', 'w', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False))
Mã đơn giản hơn trong Python 3:
import json
with open('data.txt', 'w') as f:
json.dump(data, f, ensure_ascii=False)
Trên Windows, encoding='utf-8'đối số openvẫn là cần thiết.
Để tránh lưu trữ một bản sao được mã hóa của dữ liệu trong bộ nhớ (kết quả của dumps) và để xuất ra các chuỗi phụ được mã hóa utf8 trong cả Python 2 và 3, hãy sử dụng:
import json, codecs
with open('data.txt', 'wb') as f:
json.dump(data, codecs.getwriter('utf-8')(f), ensure_ascii=False)
Cuộc codecs.getwritergọi không cần thiết trong Python 3 nhưng bắt buộc đối với Python 2
Khả năng đọc và kích thước:
Việc sử dụng ensure_ascii=Falsecho khả năng đọc tốt hơn và kích thước nhỏ hơn:
>>> 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
Cải thiện hơn nữa khả năng đọc bằng cách thêm cờ indent=4, sort_keys=True(như được đề xuất bởi dinos66 ) vào các đối số của dumphoặc dumps. Bằng cách này, bạn sẽ có được cấu trúc được sắp xếp thụt lề độc đáo trong tệp json với chi phí kích thước tệp lớn hơn một chút.