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