В чем разница между json.dump () и json.dumps () в Python?
131
Я искал в этом официальном документе разницу между json.dump () и json.dumps () в python. Понятно, что они связаны с возможностью записи в файл. Но в чем детальная разница между ними и в каких ситуациях один имеет больше преимуществ, чем другой?
Больше нечего добавить, кроме того, что написано в документации. Если вы хотите сбросить JSON в файл / сокет или что-то еще, вам следует пойти с dump(). Если вам нужна только строка (для печати, анализа или чего-то еще), используйте dumps()(строка дампа)
Как упомянул Антии Хаапала в этом ответе , есть некоторые незначительные различия в ensure_asciiповедении. В основном это связано с тем, как write()работает основная функция, поскольку она работает с частями, а не со всей строкой. Проверьте его ответ, чтобы узнать об этом подробнее.
json.dump()
Сериализуйте obj как поток в формате JSON в fp (a .write () - поддерживающий файловый объект
Если sure_ascii имеет значение False, некоторые фрагменты, записанные в fp, могут быть экземплярами Unicode.
json.dumps()
Сериализовать obj в строку в формате JSON
Если sure_ascii имеет значение False, результат может содержать символы, отличные от ASCII, а возвращаемое значение может быть экземпляром Unicode.
Можете ли вы показать пример того, как использовать dump () для отправки через сокет? Я знаю, что могу использовать dumps () и encode () для преобразования в байты, но есть ли более короткий способ?
Boy
37
Функции со sстроковыми параметрами принимают. Остальные берут файловые потоки.
Когда вы вызываете, jsonstr = json.dumps(mydata)он сначала создает полную копию ваших данных в памяти и только потом вы file.write(jsonstr)ее на диск. Так что это более быстрый метод, но может стать проблемой, если вам нужно сохранить большой кусок данных.
Когда вы вызываете json.dump(mydata, file)- без 's', новая память не используется, так как данные выгружаются порциями. Но весь процесс примерно в 2 раза медленнее.
Источник: Я проверил исходный код json.dump()и json.dumps()и также протестировали оба варианта измерения времени с time.time()и наблюдая использование памяти в HTOP.
Одно из заметных различий в Python 2 заключается в том, что если вы используете ensure_ascii=False, он dumpбудет правильно записывать данные в кодировке UTF-8 в файл (если вы не использовали 8-битные строки с расширенными символами, которые не являются UTF-8):
dumpsс другой стороны, with ensure_ascii=Falseможет создавать a strили unicodeпросто в зависимости от того, какие типы вы использовали для строк:
Сериализуйте obj в строку в формате JSON, используя эту таблицу преобразования. Если sure_ascii имеет значение False, результат может содержать символы, отличные от ASCII, а возвращаемое значение может быть unicodeэкземпляром .
(курсив мой). Обратите внимание, что это strтоже может быть экземпляр.
Таким образом, вы не можете использовать его возвращаемое значение для сохранения структуры в файл, не проверив, какой формат был возвращен, и, возможно, поигрался с ним unicode.encode.
Это, конечно, больше не актуально для Python 3, поскольку больше нет путаницы с 8-битным / Unicode.
Что касается loadvs loads, loadсчитает, что весь файл является одним документом JSON, поэтому вы не можете использовать его для чтения нескольких документов JSON с ограничением новой строки из одного файла.
Весь текст, созданный в строковом объекте python, является Unicode, но можно ли предполагать это в целом? т.е. при загрузке содержимого из файла?
Жуан Гонсалвеш,
@ JoãoGonçalves означает, что вы не можете смешивать двоичные данные с текстом, чтобы python одобрял их молча. например json.dumps([b'123'])-> TypeError.
Антти Хаапала
@ JoãoGonçalves также обратите внимание, что строки в документах JSON должны быть в Юникоде и должны быть в любом из UTF-8, UTF-16 или UTF-32 в соответствии с RFC 7159
Функции со
s
строковыми параметрами принимают. Остальные берут файловые потоки.источник
В использовании памяти и скорости.
Когда вы вызываете,
jsonstr = json.dumps(mydata)
он сначала создает полную копию ваших данных в памяти и только потом выfile.write(jsonstr)
ее на диск. Так что это более быстрый метод, но может стать проблемой, если вам нужно сохранить большой кусок данных.Когда вы вызываете
json.dump(mydata, file)
- без 's', новая память не используется, так как данные выгружаются порциями. Но весь процесс примерно в 2 раза медленнее.Источник: Я проверил исходный код
json.dump()
иjson.dumps()
и также протестировали оба варианта измерения времени сtime.time()
и наблюдая использование памяти в HTOP.источник
Одно из заметных различий в Python 2 заключается в том, что если вы используете
ensure_ascii=False
, онdump
будет правильно записывать данные в кодировке UTF-8 в файл (если вы не использовали 8-битные строки с расширенными символами, которые не являются UTF-8):dumps
с другой стороны, withensure_ascii=False
может создавать astr
илиunicode
просто в зависимости от того, какие типы вы использовали для строк:(курсив мой). Обратите внимание, что это
str
тоже может быть экземпляр.Таким образом, вы не можете использовать его возвращаемое значение для сохранения структуры в файл, не проверив, какой формат был возвращен, и, возможно, поигрался с ним
unicode.encode
.Это, конечно, больше не актуально для Python 3, поскольку больше нет путаницы с 8-битным / Unicode.
Что касается
load
vsloads
,load
считает, что весь файл является одним документом JSON, поэтому вы не можете использовать его для чтения нескольких документов JSON с ограничением новой строки из одного файла.источник
json.dumps([b'123'])
->TypeError
.