Câu trả lời:
Không có gì khác để thêm ngoài những gì tài liệu nói. Nếu bạn muốn đổ JSON vào một tệp / ổ cắm hoặc bất cứ thứ gì, thì bạn nên đi cùng dump()
. Nếu bạn chỉ cần nó dưới dạng một chuỗi (để in, phân tích cú pháp hoặc bất cứ điều gì) thì hãy sử dụng dumps()
(kết xuất chuỗi)
Như Antii Haapala đã đề cập trong câu trả lời này , có một số khác biệt nhỏ về ensure_ascii
hành vi. Điều này chủ yếu là do cách thức write()
hoạt động của chức năng cơ bản , vì nó hoạt động trên các khối chứ không phải toàn bộ chuỗi. Kiểm tra câu trả lời của anh ấy để biết thêm chi tiết về điều đó.
json.dump()
Tuần tự hóa obj dưới dạng luồng được định dạng JSON thành fp (a .write () - hỗ trợ đối tượng giống như tệp
Nếu notify_ascii là Sai, một số đoạn được ghi vào fp có thể là các trường hợp unicode
json.dumps()
Tuần tự hóa obj thành một str được định dạng JSON
Nếu notify_ascii là Sai, kết quả có thể chứa các ký tự không phải ASCII và giá trị trả về có thể là một thể hiện unicode
Các hàm với một s
tham số chuỗi mất. Những người khác lấy luồng tập tin.
Trong sử dụng bộ nhớ và tốc độ.
Khi bạn gọi jsonstr = json.dumps(mydata)
nó trước tiên sẽ tạo một bản sao đầy đủ dữ liệu của bạn trong bộ nhớ và chỉ sau đó bạn đưa file.write(jsonstr)
nó vào đĩa. Vì vậy, đây là một phương pháp nhanh hơn nhưng có thể là một vấn đề nếu bạn có một phần dữ liệu lớn để lưu.
Khi bạn gọi json.dump(mydata, file)
- không có 's', bộ nhớ mới sẽ không được sử dụng, vì dữ liệu bị bỏ đi bởi các khối. Nhưng toàn bộ quá trình chậm hơn khoảng 2 lần.
Nguồn: Tôi đã kiểm tra mã nguồn của json.dump()
và json.dumps()
và cũng đã kiểm tra cả các biến thể đo thời gian time.time()
và xem việc sử dụng bộ nhớ trong htop.
Một điểm khác biệt đáng chú ý trong Python 2 là nếu bạn đang sử dụng ensure_ascii=False
, dump
sẽ ghi đúng dữ liệu được mã hóa UTF-8 vào tệp (trừ khi bạn sử dụng chuỗi 8 bit có ký tự mở rộng không phải là UTF-8):
dumps
mặt khác, với việc ensure_ascii=False
có thể tạo ra một str
hoặc unicode
chỉ phụ thuộc vào loại bạn đã sử dụng cho chuỗi:
Tuần tự hóa obj thành một str được định dạng JSON bằng bảng chuyển đổi này. Nếu notify_ascii là Sai, kết quả có thể chứa các ký tự không phải ASCII và giá trị trả về có thể là một
unicode
thể hiện .
(nhấn mạnh của tôi). Lưu ý rằng nó vẫn có thể là một str
ví dụ.
Do đó, bạn không thể sử dụng giá trị trả về của nó để lưu cấu trúc vào tệp mà không kiểm tra định dạng nào được trả về và có thể chơi với unicode.encode
.
Tất nhiên điều này không còn là mối quan tâm hợp lệ trong Python 3 nữa, vì không còn sự nhầm lẫn 8 bit / Unicode này nữa.
Đối với load
vs loads
, load
coi toàn bộ tệp là một tài liệu JSON, vì vậy bạn không thể sử dụng nó để đọc nhiều tài liệu JSON giới hạn dòng mới từ một tệp.
json.dumps([b'123'])
> TypeError
.