Odpowiedzi:
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
Funkcje z sparametrami ciągu Take. Inni pobierają strumienie plików.
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.
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.
json.dumps([b'123'])-> TypeError.