Jaka jest różnica między json.dump () i json.dumps () w pythonie?

131

Przeszukałem ten oficjalny dokument, aby znaleźć różnicę między json.dump () i json.dumps () w pythonie. Oczywiste jest, że są one związane z opcją zapisu do pliku.
Ale jaka jest szczegółowa różnica między nimi iw jakich sytuacjach ma się większą przewagę niż inne?

Kumaran
źródło

Odpowiedzi:

146

Nie ma nic więcej do dodania poza tym, co mówią doktorzy. Jeśli chcesz zrzucić JSON do pliku / gniazda lub cokolwiek innego, powinieneś to zrobić dump(). Jeśli potrzebujesz go tylko jako ciąg znaków (do drukowania, analizowania itp.), Użyjdumps() (dump string)

Jak wspomniał Antii Haapala w tej odpowiedzi , istnieją pewne drobne różnice w ensure_asciizachowaniu. Wynika to głównie z tego, jak działa podstawowa write()funkcja, ponieważ działa na fragmentach, a nie na całym ciągu. Sprawdź jego odpowiedź, aby uzyskać więcej informacji na ten temat.

json.dump()

Serialize obj jako strumień w formacie JSON do fp (a .write () - obsługujący obiekt podobny do pliku

Jeśli parametr secure_ascii ma wartość False, niektóre fragmenty zapisane w fp mogą być instancjami Unicode

json.dumps()

Serializuj obj do str w formacie JSON

Jeśli parametr sure_ascii ma wartość False, wynik może zawierać znaki spoza zestawu ASCII, a zwracana wartość może być instancją Unicode

João Gonçalves
źródło
Czy możesz pokazać przykład, jak używać dump () do wysyłania przez gniazdo? Wiem, że mogę użyć dumps (), a następnie encode () do konwersji na bajty, ale czy istnieje krótsza droga?
Boy
37

Funkcje z sparametrami ciągu Take. Inni pobierają strumienie plików.

Pratik Gujarathi
źródło
20

W zużyciu pamięci i szybkości.

Kiedy dzwonisz jsonstr = json.dumps(mydata), najpierw tworzy pełną kopię twoich danych w pamięci, a dopiero potem tyfile.write(jsonstr) ją na dysk. Jest to więc szybsza metoda, ale może stanowić problem, jeśli masz dużo danych do zapisania.

Kiedy zadzwonisz json.dump(mydata, file) - bez 's', nowa pamięć nie jest używana, ponieważ dane są zrzucane przez fragmenty. Ale cały proces jest około 2 razy wolniejszy.

Źródło: Sprawdziłem kod źródłowy json.dump()i json.dumps(), a także testowane zarówno warianty pomiarze czasu z time.time()i obserwując zużycie pamięci w htop.

JenyaKh
źródło
6

Jedną zauważalną różnicą w Pythonie 2 jest to, że jeśli używasz ensure_ascii=False, dumppoprawnie zapisze dane zakodowane w UTF-8 do pliku (chyba że użyłeś 8-bitowych ciągów z rozszerzonymi znakami, które nie są UTF-8):

dumpsz drugiej strony with ensure_ascii=Falsemoże dać strlub unicodetylko w zależności od typów użytych dla łańcuchów:

Serializuj obj do str w formacie JSON przy użyciu tej tabeli konwersji. Jeśli zapewniają_ascii ma wartość False, wynik może zawierać znaki spoza zestawu ASCII, a wartość zwracana może być unicodeinstancją .

(podkreślenie moje). Pamiętaj, że nadal może to być strinstancja.

W związku z tym nie możesz użyć jego wartości zwracanej do zapisania struktury do pliku bez sprawdzenia, który format został zwrócony i prawdopodobnie nie bawił się nim unicode.encode.

To oczywiście nie dotyczy już Pythona 3, ponieważ nie ma już zamieszania w 8-bit / Unicode.


Jeśli chodzi o loadvs loads, loadtraktuje cały plik jako jeden dokument JSON, więc nie można go używać do odczytu wielu dokumentów JSON z ograniczeniem nowej linii z jednego pliku.

Antti Haapala
źródło
Cały tekst utworzony w obiekcie ciągu znaków w języku Python ma format Unicode, ale czy można bezpiecznie założyć, że ogólnie? tj. podczas ładowania zawartości z pliku?
João Gonçalves,
@ JoãoGonçalves oznacza to, że nie można mieszać danych binarnych z tekstem, więc Python zatwierdza je po cichu. np. json.dumps([b'123'])-> TypeError.
Antti Haapala
@ JoãoGonçalves również zauważ, że ciągi w dokumentach JSON muszą być w formacie Unicode i muszą być w dowolnym z UTF-8, UTF-16 lub UTF-32 zgodnie z RFC 7159
Antti Haapala
1
Dzięki za to wyjaśnienie! To ma sens
João Gonçalves