it-roy-ru.com

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

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

85
Kumaran

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

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

json.dump()

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

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

json.dumps()

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

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

93
João Gonçalves

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

23
Pratik Gujarathi

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

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

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

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

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

Это, конечно, больше не относится к Python 3, поскольку больше нет этой 8-битной путаницы с Unicode.


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

5
Antti Haapala