Привет, любители Python! Сегодня мы займемся распространенной задачей преобразования данных: преобразованием JSON в CSV. К концу этой статьи вы будете вооружены знаниями и инструментами для легкого преобразования данных JSON в формат CSV с помощью Python. Если ответ нужен сразу, способов два: встроенные модули json и csv, где данные читаются функцией json.loads() и пишутся через csv.DictWriter, либо библиотека pandas, у которой на все про все уходит две строки: pd.read_json() и to_csv(). Итак, давайте приступим!
Кратко
- Задача решается двумя путями: встроенными модулями
jsonиcsvлибо библиотекой pandas. - Встроенный путь:
json.loads()превращает текст в список словарей, аcsv.DictWriterзаписывает его в файл вместе со строкой заголовков. - Через pandas то же самое занимает две строки:
read_json()иto_csv('output.csv', index=False). - Параметр
newline=''вopen()обязателен: без него в Windows между строками появятся пустые. - CSV плоский по своей природе, поэтому вложенный JSON приходится разворачивать: у pandas для этого есть
json_normalize(). - Если у записей разный набор ключей,
DictWriterброситValueErrorна лишнем ключе, а недостающий оставит пустой ячейкой.
Формат файла CSV
CSV (значения, разделенные запятыми) это простой формат файла, используемый для хранения табличных данных, таких как электронная таблица или база данных. Каждая строка в файле CSV представляет собой строку, а каждое значение разделяется запятой. Вот краткий пример:
name,age,city
Alice,30,New York
Bob,25,Los Angeles
Charlie,35,ChicagoФормат файла JSON
JSON (JavaScript Object Notation) это облегченный формат обмена данными, который легко читать и писать людям, а также легко анализировать и генерировать машинам. Он представляет данные в виде пар ключ-значение, то есть ровно так же, как словари Python. Вот пример:
{
"name": "Alice",
"age": 30,
"city": "New York"
}Преобразование с использованием библиотек JSON и CSV
Начнем с основ: использования встроенных в Python библиотек json и csv для выполнения преобразования. Вот пошаговое руководство:
Шаг 1: Импорт библиотек
import json
import csvШаг 2: Загрузка данных JSON
Сначала мы загрузим данные JSON. Вы можете прочитать его из файла или использовать строку JSON напрямую.
json_data = '''
[
{"name": "Alice", "age": 30, "city": "New York"},
{"name": "Bob", "age": 25, "city": "Los Angeles"},
{"name": "Charlie", "age": 35, "city": "Chicago"}
]
'''
data = json.loads(json_data)Шаг 3: Запись в CSV
Далее мы запишем данные JSON в файл CSV.
with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = ['name', 'age', 'city']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for row in data:
writer.writerow(row)И вот оно! Ваши данные JSON теперь аккуратно отформатированы в файл CSV.
Два параметра в open() здесь не формальность. newline='' не дает Windows задваивать перенос строки, иначе между записями появятся пустые строки. А encoding='utf-8' нужен, чтобы файл не записался в системной кодировке: на латинице разницы не видно, а вот кириллица у получателя превратится в мусор. Если CSV потом открывают в Excel, берите encoding='utf-8-sig': эта метка в начале файла подскажет редактору кодировку.
Конвертация с использованием библиотеки Pandas
Если вы ищете более мощный и гибкий подход, библиотека Pandas ваш друг. Pandas это популярная библиотека для обработки данных на Python, которая упрощает работу со структурированными данными (мы уже пользовались ею, когда чистили данные от пропусков). Давайте посмотрим, как мы можем использовать его для преобразования JSON в CSV.
Шаг 1: Установка Pandas
Если вы еще этого не сделали, установите Pandas с помощью pip:
pip install pandasШаг 2: Импорт Pandas
import pandas as pd
from io import StringIOШаг 3: Загрузка данных JSON
Аналогично предыдущему методу, загрузите данные JSON.
json_data = '''
[
{"name": "Alice", "age": 30, "city": "New York"},
{"name": "Bob", "age": 25, "city": "Los Angeles"},
{"name": "Charlie", "age": 35, "city": "Chicago"}
]
'''
data = pd.read_json(StringIO(json_data))Обертка StringIO тут обязательна. Раньше в read_json() можно было передать саму строку с JSON, но с pandas 2.1 такой вызов объявлен устаревшим, а в свежих версиях аргумент считается уже путем к файлу и попытка заканчивается ошибкой FileNotFoundError. StringIO из модуля io превращает строку в то, что библиотека готова читать (документация read_json).
Шаг 4: Запись в CSV
С Pandas запись в CSV-файл выполняется просто.
data.to_csv('output.csv', index=False)Вот и все! Вы преобразовали данные JSON в CSV с помощью Pandas всего в несколько строк кода.
Какой способ выбрать
Оба способа дают одинаковый файл, но удобны в разных ситуациях:
| Критерий | Встроенные json и csv | pandas |
|---|---|---|
| Что нужно установить | ничего, модули идут со стандартной библиотекой | pip install pandas |
| Код для плоского JSON | цикл с DictWriter, примерно семь строк |
две строки: чтение и запись |
| Вложенные структуры | разворачивать вручную | json_normalize() разложит вложенность по колонкам |
| Разный набор полей | лишний ключ это ValueError, недостающий пустая ячейка |
недостающие значения заполняются автоматически |
| Память | пишет построчно, размер файла не важен | держит всю таблицу в памяти |
| Когда брать | скрипт без зависимостей, большие или потоковые данные | анализ данных и сложные преобразования |
Ограничения и альтернативы
Хотя преобразование JSON в CSV часто бывает простым, есть некоторые ограничения и альтернативы, которые следует учитывать:
- Вложенный JSON: если ваши данные JSON содержат вложенные структуры, вам необходимо будет выровнять их перед преобразованием в CSV: у pandas для этого есть
json_normalize(). - Потеря данных: JSON может представлять более сложные типы данных, чем CSV, поэтому часть информации может быть потеряна при преобразовании.
- Инструменты: рассмотрите возможность использования других инструментов или библиотек, таких как
xml.etree.ElementTreeдля данных XML или сторонних библиотек для более сложных преобразований.
Как развернуть вложенный JSON
Покажу на примере. Допустим, у каждой записи есть вложенный адрес:
import pandas as pd
nested = [{"name": "Alice", "address": {"city": "New York", "zip": "10001"}}]
# Без выравнивания вложенный словарь попадет в ячейку целиком
print(pd.DataFrame(nested).to_csv(index=False))
# json_normalize разложит его по колонкам
print(pd.json_normalize(nested).to_csv(index=False))Разница в выводе видна сразу:
name,address
Alice,"{'city': 'New York', 'zip': '10001'}"
name,address.city,address.zip
Alice,New York,10001Имена вложенных колонок склеиваются через точку, а разделитель при желании меняется параметром sep: с sep='_' получится address_city.
Лучшие практики
Чтобы обеспечить плавное и точное преобразование, следуйте этим рекомендациям:
- Проверяйте данные JSON перед преобразованием.
- Обрабатывайте исключения, чтобы перехватывать и управлять ошибками во время преобразования.
- Используйте библиотеки, такие как Pandas, для больших наборов данных, чтобы воспользоваться его мощными возможностями манипулирования данными.
- Проверяйте вывод, чтобы убедиться, что преобразованный CSV-файл соответствует вашим требованиям.
Резюме и заключение
В этой статье мы рассмотрели, как преобразовать JSON в CSV в Python, используя как встроенные библиотеки json и csv, так и более мощную библиотеку Pandas. Мы обсудили преимущества, ограничения и рекомендации, чтобы обеспечить плавный процесс преобразования.
Продолжайте практиковать эти методы, и вскоре вы станете экспертом по преобразованию данных. Помните, каждый шаг, который вы делаете в изучении Python, приближает вас к овладению языком. Удачного кодирования!
Дополнительные ресурсы
Не стесняйтесь погружаться в эти ресурсы для более глубокого понимания и более продвинутых методов. Вы так быстро все схватываете, продолжайте в том же духе, и скоро вы станете мастером преобразования данных в Python!
Вопросы и ответы
Как преобразовать JSON в CSV в Python?
Двумя способами. Без сторонних библиотек: json.loads() превращает текст JSON в список словарей, а csv.DictWriter пишет эти словари в файл, добавив строку заголовков. С pandas короче: pd.read_json() собирает таблицу, а to_csv('output.csv', index=False) сохраняет ее. Результат у обоих способов одинаковый.
Зачем в open() параметр newline=''?
Чтобы в файле не появились лишние переводы строк. Модуль csv сам ставит в конце строки \r\n, а open() без этого параметра в Windows превращает каждый такой перенос в \r\r\n. В результате между записями возникают пустые строки, которые особенно хорошо видно в Excel. Параметр newline='' отключает эту подмену.
Что делать с вложенным JSON?
CSV это плоская таблица, поэтому вложенность надо разложить по колонкам. Проще всего это делает pandas.json_normalize(): из записи с полем address получатся колонки address.city и address.zip. Если этого не сделать, вложенный словарь попадет в ячейку как текст вида {'city': 'NY'}, и работать с ним дальше будет нельзя.
Почему в CSV вместо кириллицы кракозябры?
Потому что open() без параметра encoding берет системную кодировку, а в Windows это обычно не UTF-8. Указывайте кодировку явно: encoding='utf-8'. Если файл потом открывают в Excel, берите encoding='utf-8-sig': он добавит в начало файла метку, по которой Excel поймет кодировку правильно.
Что будет, если у записей разный набор полей?
Зависит от инструмента. DictWriter строгий: если в словаре есть ключ, которого нет в fieldnames, он бросит ValueError: dict contains fields not in fieldnames, а вот недостающий ключ просто оставит пустую ячейку (значение по умолчанию задается параметром restval). pandas мягче: он соберет все колонки, а пропуски заполнит пустыми значениями.
Когда брать pandas, а когда хватит встроенных модулей?
Если данные плоские, а скрипт должен работать где угодно без установки зависимостей, хватит json и csv: они пишут файл построчно и не зависят от его размера. pandas стоит брать, когда данные все равно нужно анализировать, фильтровать или объединять, или когда JSON вложенный и его удобно разложить через json_normalize(). Но помните, что pandas держит всю таблицу в памяти.
Читайте также: