Чтение и сохранение в файл списков и словарей в Python.
Строки могут быть легко записаны и считаны из файла. Числа требуют немного больше усилий, так как метод file.read() возвращает только строки, которые должны быть переданы функции int() , которая принимает строку типа '123' и возвращает ее числовое значение 123 . Когда вы хотите сохранить более сложные типы данных, такие как вложенные списки и словари, разбор и сериализация вручную усложняются.
Вместо того, чтобы пользователи постоянно писали и отлаживали код для сохранения сложных типов данных в файлы, Python позволяет использовать популярный формат обмена данными, называемый JSON (JavaScript Object Notation). Стандартный модуль, называемый json , может принимать иерархии данных Python и преобразовывать их в строковые представления. Этот процесс называется сериализацией. Восстановление данных из строкового представления называется десериализацией. Между сериализацией и десериализацией строка, представляющая объект, может быть сохранена в файле или отправлена по сетевому соединению на какой-либо удаленный компьютер.
Если у вас есть объект x , вы можете просмотреть его строковое представление JSON с помощью простой строки кода:
Другой метод этого модуля json.dump() просто сериализует объект в текстовый файл. Итак, если объект fp текстового файла открыт для записи, мы можем сделать следующее:
Чтобы снова декодировать объект, если fp это объект текстового файла, который был открыт для чтения:
Этот простой метод сериализации может обрабатывать списки и словари, но сериализация произвольных экземпляров классов в JSON требует дополнительных усилий.
Дополнительно смотрите встроенный модуль pickle . В отличие от JSON , pickle — это протокол, который позволяет сериализовать произвольно сложные объекты Python.
Протокол pickle специфичен для Python и не может использоваться для связи с приложениями, написанными на других языках. Он также по умолчанию небезопасен! Десериализация данных pickle , поступающих из ненадежного источника, может выполнить произвольный код, если данные были созданы опытным злоумышленником.
Работа с JSON в Python
JSON (JavaScript Object Notation) — текстовый формат обмена данными, удобный для чтения и написания как человеком, так и компьютером. Он основан на подмножестве языка программирования JavaScript.
JSON основан на двух структурах данных:
- Коллекция пар ключ-значение (объект)
- Упорядоченный список значений (массив)
Это универсальные структуры данных. Почти все современные языки программирования поддерживают их в какой-либо форме. В нотации JSON это выглядит так:
Объект — неупорядоченный набор пар ключ-значение. Объект начинается с <и заканчивается >. Ключ и значение разделяются двоеточием, сами пары ключ-значение разделяются запятой.
Массив — упорядоченная коллекция значений. Массив начинается с [ и заканчивается ]. Значения разделены запятой.
Значение может быть строкой в двойных кавычках, числом, true , false , null , объектом или массивом. Эти структуры могут быть вложенными.
Строка — коллекция нуля или больше символов Unicode, заключенная в двойные кавычки, используя \ (обратную косую черту) в качестве символа экранирования. Для представления числа используется только десятичная система счисления.
How to dump a dict to a JSON file?
I can’t figure out how to dump the dict to a JSON file as showed below:
Is there a pythonic way to do this?
You may guess that I want to generate a d3 treemap.
![]()
7 Answers 7
This is an easier way to do it.
In the second line of code the file result.json gets created and opened as the variable fp .
In the third line your dict sample gets written into the result.json !
![]()
Combine the answer of @mgilson and @gnibbler, I found what I need was this:
It this way, I got a pretty-print json file. The tricks print >> f, j is found from here: http://www.anthonydebarros.com/2012/03/11/generate-json-from-sql-using-python/
Of course, it’s unlikely that the order will be exactly preserved . But that’s just the nature of dictionaries .
![]()
This should give you a start
![]()
with pretty-print format:
Also wanted to add this (Python 3.7)
Update (11-04-2021): So the reason I added this example is because sometimes you can use the print() function to write to files, and this also shows how to use the indentation (unindented stuff is evil!!). However I have recently started learning about threading and some of my research has shown that the print() statement is not always thread-safe. So if you need threading you might want to be careful with this one.