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?
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
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.
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.
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.
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
Funkcje z
s
parametrami ciągu Take. Inni pobierają strumienie plików.źródło
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()
ijson.dumps()
, a także testowane zarówno warianty pomiarze czasu ztime.time()
i obserwując zużycie pamięci w htop.źródło
Jedną zauważalną różnicą w Pythonie 2 jest to, że jeśli używasz
ensure_ascii=False
,dump
poprawnie 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):dumps
z drugiej strony withensure_ascii=False
może daćstr
lubunicode
tylko w zależności od typów użytych dla łańcuchów:(podkreślenie moje). Pamiętaj, że nadal może to być
str
instancja.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
load
vsloads
,load
traktuje 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.źródło
json.dumps([b'123'])
->TypeError
.