Работа с JSON и CSV
Превращайте объекты Python в файлы, которые смогут прочитать другие программы, и читайте их обратно
json для вложенных, типизированных данных и csv для плоских, табличных данных.
- объяснить, что такое сериализация и почему файлы переживают память программы,
- преобразовывать объекты Python в текст JSON и обратно с помощью
json.dumps/loadsи читать/записывать файлы черезjson.dump/load, - читать и предсказывать соответствие типов Python ↔ JSON (и его острые углы: кортежи,
None, ключи словарей), - читать и записывать табличные данные с помощью
csv.reader/writerи более удобныхcsv.DictReader/DictWriter, - избегать классических ловушек CSV — ошибки с пустыми строками, того что всё является строкой, и кодировки,
- осознанно выбирать JSON или CSV под конкретную задачу, а не по привычке.
1. Структурированные данные и сериализация
Представьте данные вашей программы как содержимое комнаты: мебель, коробки, провода — всё расставлено и связано. Чтобы перевезти это в другой дом, нельзя телепортировать комнату; вы упаковываете всё в подписанные коробки (формат, понятный грузчикам), везёте коробки, а затем распаковываете на другом конце, чтобы восстановить расстановку. Сериализация — это упаковка объектов из памяти в плоский поток текста; десериализация — распаковка этого текста обратно в живые объекты.
Почему текст? Потому что словарь Python в памяти — это клубок указателей, понятный только этому процессу Python. Текстовый файл, напротив, универсален — его могут прочитать электронная таблица, приложение на JavaScript, инструмент импорта базы данных или редактор коллеги. JSON и CSV — это два согласованных текстовых формата:
- JSON (JavaScript Object Notation) хранит вложенные, типизированные данные: объекты внутри списков внутри объектов. Он почти один в один соответствует словарям и спискам Python, поэтому это язык по умолчанию для веб-API и файлов конфигурации.
- CSV (Comma-Separated Values, значения, разделённые запятыми) хранит одну плоскую таблицу: строки и столбцы, как один лист электронной таблицы. Он компактен, и его открывает любая табличная программа, но в нём нет вложенности и типов.