Sự khác biệt giữa json.dump () và json.dumps () trong python là gì?


131

Tôi đã tìm kiếm trong tài liệu chính thức này để tìm sự khác biệt giữa json.dump () và json.dumps () trong python. Rõ ràng là chúng có liên quan với tùy chọn ghi tập tin.
Nhưng sự khác biệt chi tiết giữa chúng là gì và trong tình huống nào người ta có lợi thế hơn người khác?

Câu trả lời:


146

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_asciihà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


Bạn có thể đưa ra một ví dụ về cách sử dụng dump () để gửi qua ổ cắm không? Tôi biết rằng tôi có thể sử dụng kết xuất () và hơn encode () để chuyển đổi thành byte, nhưng có cách nào ngắn hơn không?
Cậu bé

37

Các hàm với một stham số chuỗi mất. Những người khác lấy luồng tập tin.


20

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()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.


6

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, dumpsẽ 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):

dumpsmặt khác, với việc ensure_ascii=Falsecó thể tạo ra một strhoặc unicodechỉ 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 unicodethể hiện .

(nhấn mạnh của tôi). Lưu ý rằng nó vẫn có thể là một strví 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 loadvs loads, loadcoi 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.


Tất cả văn bản được tạo trong một đối tượng chuỗi python là unicode, nhưng liệu có an toàn khi giả định điều đó không? tức là khi tải nội dung từ một tập tin?
João Gonçalves

@ JoãoGonçalves có nghĩa là bạn không thể trộn dữ liệu nhị phân với văn bản để python chấp thuận nó một cách im lặng. ví dụ: json.dumps([b'123'])> TypeError.
Antti Haapala 17/03/2016

@ JoãoGonçalves cũng lưu ý rằng các chuỗi trong tài liệu JSON phải là Unicodephải ở bất kỳ UTF-8, UTF-16 hoặc UTF-32 nào theo RFC 7159
Antti Haapala

1
Cảm ơn lời giải thích đó! Có ý nghĩa
João Gonçalves
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.