Để 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ố open
vẫ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.getwriter
gọ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=False
cho 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 dump
hoặ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.