Подтвердить что ты не робот

В чем разница между json.dump() и json.dumps() в python?

Я искал в официальном документе этот, чтобы найти разницу между json.dump() и json.dumps() в python. Понятно, что они связаны с возможностью записи файла.
Но какова подробная разница между ними и в каких ситуациях у кого больше преимуществ, чем у других?

4b9b3361

Ответ 1

Больше нечего добавить, кроме того, что сказано в документации. Если вы хотите записать JSON в файл/сокет или что-то еще, то вам следует перейти к dump(). Если вам нужна только строка (для печати, анализа или чего-либо еще), используйте dumps() (строка дампа)

Как упоминал Антии Хаапала в этом ответе, есть некоторые незначительные различия в поведении ensure_ascii. Это происходит главным образом из-за того, как работает основная функция write(), поскольку она работает с кусками, а не со всей строкой. Проверьте ответ для более подробной информации об этом.

json.dump()

Сериализация obj как потока в формате JSON для файлового объекта fp (.write() -supporting

Если sure_ascii имеет значение False, некоторые чанки, записанные в fp, могут быть экземплярами юникода

json.dumps()

Сериализация obj в формате JSON

Если sure_ascii имеет значение False, результат может содержать не-ASCII символы, а возвращаемое значение может быть экземпляром Unicode

Ответ 2

Функции с s принимают строковые параметры. Другие берут файл потоки.

Ответ 3

Одна заметная разница в Python 2 заключается в том, что если вы используете ensure_ascii=False, dump будет правильно записывать кодированные данные UTF-8 в файл (если вы не использовали 8-битные строки с расширенные символы, которые не являются UTF-8):

dumps, с ensure_ascii=False может создавать str или unicode только в зависимости от того, какие типы вы использовали для строк:

Сериализуйте obj на форматированную строку JSON, используя эту таблицу преобразования. Если security_ascii является False, результат может содержать символы, отличные от ASCII, а возвращаемое значение может быть экземпляром unicode.

(акцент мой). Обратите внимание, что он все равно может быть экземпляром str.

Таким образом, вы не можете использовать его возвращаемое значение для сохранения структуры в файл без проверки того, формат был возвращен и, возможно, играл с unicode.encode.

Это, конечно, не актуально в Python 3, так как больше нет этой 8-битной/Unicode-замешательства.


Что касается load vs loads, load считает, что файл целое является одним JSON-документом, поэтому вы не можете использовать его для чтения нескольких документов JSON с ограничением длины строки из одного файла.

Ответ 4

В использовании памяти и скорости.

Когда вы вызываете jsonstr = json.dumps(mydata) он сначала создает полную копию ваших данных в памяти, и только затем вы file.write(jsonstr) на диске. Так что это более быстрый метод, но может быть проблемой, если у вас есть большой кусок данных для сохранения.

Когда вы вызываете json.dump(mydata, file) - без 's', новая память не используется, так как данные выгружаются кусками. Но весь процесс примерно в 2 раза медленнее.

Источник: я проверил исходный код json.dump() и json.dumps() а также протестировал оба варианта, измеряя время с помощью time.time() и наблюдая за использованием памяти в htop.