Преобразование JSON в CSV в Python

Python — это мощный набор инструментов для специалистов по данным и разработчиков. Часто эти две дисциплины встречаются на стыке преобразования данных. Одним из распространенных требований к преобразованию является преобразование данных CSV в данные нотации объектов JavaScript (JSON). К счастью, библиотека Pandas делает это преобразование быстрым и эффективным.

Pandas — это мощная библиотека обработки данных, с помощью которой разработчики и ученые, работающие с данными, могут эффективно и удобно получать доступ к данным, анализировать их и манипулировать ими. Среди множества удобных методов и функций, имеющихся в библиотеке Pandas, естьметод to_json. Этот метод, найденный в классе DataFrame, представляет собой мощный инструмент для преобразования данных из CSV в JSON.

Настройка проекта

Для этого проекта мы создадим несколько выборочных данных о случайных людях, владеющих информацией. Мы будем использовать этот удобный скрипт Python для генерации случайной личной информации, создания следующих данных в формате JSON, сохраненных в виде локального файла с именем people.json.

[{"id": 1, "first_name": "Alice", "last_name": "Smith", "location": {"City": "Denver", "State": "Colorado"}, "age": 18}, {"id": 2, "first_name": "Bob", "last_name": "Anderson", "location": {"City": "Dallas", "State": "Texas"}, "age": 24}, {"id": 3, "first_name": "Alice", "last_name": "Jacobs", "location": {"City": "Los Angeles", "State": "California"}, "age": 18}, {"id": 4, "first_name": "Bob", "last_name": "Williams", "location": {"City": "Dallas", "State": "Texas"}, "age": 24}, {"id": 5, "first_name": "Pat", "last_name": "Anderson", "location": {"City": "Miami", "State": "Florida"}, "age": 60}]

Имея эти данные, мы можем использовать возможности Pandas для удобной загрузки наших данных в формате CSV в виде объекта DataFrame, который затем можно преобразовать в CSV по желанию.

Шаг 1. Загрузите JSON в DataFrame.

DataFrames — это мощные инструменты для управления двумерными данными (или многомерными данными, уменьшенными как таковые) с большим вниманием к оптимизации низкого уровня. A DataFrame также может быстро и эффективно экспортировать данные в файлы CSV — именно это нам и нужно. Мы можем загрузить people.json данные файла как DataFrame таковые:

# Load via context manager and read_json() method
with open('people.json', 'r')as file:
    df = pd.read_json(file.read())

# view result
print(df)

   id first_name last_name                                        location  age
0   1      Alice     Smith         {'City': 'Denver', 'State': 'Colorado'}   18
1   2        Bob  Anderson            {'City': 'Dallas', 'State': 'Texas'}   24
2   3      Alice    Jacobs  {'City': 'Los Angeles', 'State': 'California'}   18
3   4        Bob  Williams            {'City': 'Dallas', 'State': 'Texas'}   24
4   5        Pat  Anderson           {'City': 'Miami', 'State': 'Florida'}   60

Это подводит нас довольно близко, но есть две заметные проблемы, одна из которых имеет серьезную важность:

  1. Столбец location содержит вложенные данные JSON, которые не были импортированы должным образом.
  2. Столбец id можно использовать для индексации наших данных (необязательно).

Чтобы решить первую проблему, нам придется изменить подход, с помощью которого мы загружали наши данные.

Шаг 2.а: Работа с вложенными данными JSON

На первом этапе мы загрузили наши данные напрямую через read_json функцию библиотеки Pandas. При этом необработанные данные JSON загружаются непосредственно в файл DataFrame. Чтобы загрузить вложенный JSON как DataFrame нам нужно воспользоваться этой json_normalize функцией. Однако эта функция принимает dictобъект в качестве аргумента. Таким образом, нам нужно сначала загрузить данные JSON как dict таковые:

import json

# Load via context manager and read_json() method
with open('people.json', 'r')as file:

    # load JSON data and parse into Dictionary object
    data = json.load(file)

# Load JSON as DataFrame 
df = pd.json_normalize(data)

# Print Result
print(df)

   id first_name last_name  age location.City location.State
0   1      Alice     Smith   18        Denver       Colorado
1   2        Bob  Anderson   24        Dallas          Texas
2   3      Alice    Jacobs   18   Los Angeles     California
3   4        Bob  Williams   24        Dallas          Texas
4   5        Pat  Anderson   60         Miami        Florida

Здесь мы видим, как ключи поля местоположения автоматически преобразуются в имена столбцов, разделенные точками.

Шаг 2.б: Переиндексация

Эти данные создадут дополнительный столбец, если они будут экспортированы непосредственно в CSV (столбец индекса). Существует несколько способов обработки этого, но удобным средством является метод setindex — он создаст визуальное представление изменения в DataFrame. также. Это достигается следующим образом:

# set index
df.set_index('id', inplace=True)

# view result
print(df)

   first_name last_name  age location.City location.State
id                                                       
1       Alice     Smith   18        Denver       Colorado
2         Bob  Anderson   24        Dallas          Texas
3       Alice    Jacobs   18   Los Angeles     California
4         Bob  Williams   24        Dallas          Texas
5         Pat  Anderson   60         Miami        Florida

Шаг 3. Экспорт в файл CSV.

На этом этапе наши данные готовы к экспорту в файл CSV. К счастью, в Pandas есть методы как для загрузки, так и для сохранения данных CSV. Мы можем вывести наш DataFrame в файл формата CSV, используя следующий метод to_csv:

import os

# output DataFrame to CSV file
df.to_csv('people.csv')

# view file metedata
print(os.stat('people.csv'))

os.stat_result(st_mode=33206, st_ino=56294995342297639, st_dev=2997963831, st_nlink=1, st_uid=0, st_gid=0, st_size=231, st_atime=1657209167, st_mtime=1657209167, st_ctime=1657209167)

Здесь мы сохраняем данные в локальный файл с именем, people.csv а также подтверждаем некоторые метаданные файла после процесса, включая время создания и размер файла. Давайте посмотрим на данные, загруженные в Microsoft Excel, чтобы увидеть, что дал наш процесс преобразования:

Экспорт данных JSON в CSV с алфавитами панд

Рис. 1. Экспортированные данные CSV, загруженные в Microsoft Excel, отображающие результат преобразования JSON в CSV.

Здесь мы видим версию Microsoft Excel нашего DataFrame, представленную, как и ожидалось. Это подтверждает, что мы действительно преобразовали данные JSON в CSV, используя DataFrame Pandas, а также методы normalize_json и to_csv.

Общие проблемы

Часто возникают проблемы при работе с файлами в формате JSON в Python. Эта json библиотека — часть стандартной библиотеки Python — предоставляет полезные инструменты для решения таких проблем. Однако иногда синтаксис и логическая последовательность этих инструментов могут быть неясными, что приводит к исключениям, которые могут вызвать путаницу. Ниже приведены некоторые распространенные проблемы.

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

В большинстве случаев эта ошибка возникает из-за попытки использовать json.loads() метод для самого пути к файлу, а не для содержимого файла. Например, следующий подход неверен:

# Trying to load the filepath
df = pd.read_json(json.loads('people.json'))

# Resulting Exception
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Правильным подходом было бы сначала создать указатель файла для ссылки на файловый объект как таковой:

# use context manager and get reference to file object
with open('people.json', 'r')as file:

    # use the loads() method on actual file data
    data = json.loads(file.read())

Обратите внимание, что метод с использованием read_json используется в аналогичном методе.

Последние мысли

Pandas — невероятный инструмент как для специалистов по данным, так и для любителей. Его мощные низкоуровневые оптимизации позволяют быстро обрабатывать числа, а хорошо продуманные функции сохраняют синтаксическую простоту, перед которой можно трепетать. При работе с данными необходимо учитывать множество факторов, таких как замена отсутствующих записей, при необходимости табулирование данных JSON (аналогично процессу преобразования CSV) и даже агрегирование данных временных рядов. Pandas предоставляет инструменты для решения всех этих проблем и многого другого!