Создать вложенный JSON из CSV

Я уже читаюСоздать вложенный JSON из плоского CSV, но это не такне поможет в моем случае.

У меня есть довольно большая таблица, созданная с помощью Документов Google, состоящая из 11 строк и 74 столбцов (некоторые столбцы не заняты).

Я создал пример наГугл Диск, Когда экспортируется какCSV это выглядит так:

id,name,email,phone,picture01,picture02,picture03,status
1,Alice,[email protected],2131232,"image01_01
[this is an image]",image01_02,image01_03,single
2,Bob,[email protected],2854839,image02_01,"image02_02
[description to image 2]",,married
3,Frank,[email protected],987987,image03_01,image03_02,,single
4,Shawn,[email protected],,image04_01,,,single

Теперь я хотел бы иметьJSON структура, которая выглядит так:

{
    "persons": [
        {
            "type": "config.profile",
            "id": "1",
            "email": "[email protected]",
            "pictureId": "p01",
            "statusId": "s01"
        },
        {
            "type": "config.pictures",
            "id": "p01",
            "album": [
                {
                    "image": "image01_01",
                    "description": "this is an image"
                },
                {
                    "image": "image_01_02",
                    "description": ""
                },
                {
                    "image": "image_01_03",
                    "description": ""
                }
            ]
        },
        {
            "type": "config.status",
            "id": "s01",
            "status": "single"
        },
        {
            "type": "config.profile",
            "id": "2",
            "email": "[email protected]",
            "pictureId": "p02",
            "statusId": "s02"
        },
        {
            "type": "config.pictures",
            "id": "p02",
            "album": [
                {
                    "image": "image02_01",
                    "description": ""
                },
                {
                    "image": "image_02_02",
                    "description": "description to image 2"
                }
            ]
        },
        {
            "type": "config.status",
            "id": "s02",
            "status": "married"
        }
    ]
}

И так далее для других строк.

Мой теоретический подход должен был бы пройти черезCSV файл на строку (здесь начинается первая проблема: теперь каждая строка равна одной строке, а иногда и нескольким, поэтому мне нужно посчитать запятые?). Каждый ряд равен блокуconfig.profile, в том числе , ,idemailpictureId, а такжеstatusId (последние два генерируются в зависимости от номера строки).

Тогда для каждого рядаconfig.pictures блок генерируется с тем жеid как тот, который вставлен вconfig.profile блок.album это массив из столько элементов, сколько даны изображения.

Наконец, каждый ряд имеетconfig.status блок, который, опять же, имеет тот жеid как тот, который дан вconfig.profileи одна записьstatus с соответствующим статусом.

Я совершенно не знаю, как создать вложенный и условный файл JSON.

Я просто добрался до точки, где я преобразуюCSV к действиюJSONбез вложений и дополнительной информации, которые прямо не указаны вCSV, словно , ,typepictureIdstatusId, и так далее.

Любая помощь приветствуется. Если это проще запрограммировать на другом языке сценариев (например,ruby) Я бы с удовольствием переключился на те).

Прежде чем кто-то думает, что это домашнее задание или еще много чего. Это не. Я просто хочу автоматизировать очень утомительную копию иВставить задачу.

 Andrew11 июн. 2013 г., 13:58

Ответы на вопрос(1)

Решение Вопроса

csv Модуль отлично справится с чтением CSV - включая обработку разрывов строк, заключенных в кавычки.

with open('my_csv.csv') as csv_file:
   for row in csv.reader(csv_file):
       # do work

csv.reader Объект является итератором - вы можете перебирать строки в CSV, используяfor петля. Каждая строка представляет собой список, поэтому вы можете получить каждое поле как,row[0]row[1]и т. д. Имейте в виду, что при этом будет загружена первая строка (которая содержит только имена полей в вашем случае).

Поскольку у нас есть имена полей, данные нам в первом ряду, мы можем использоватьcsv.DictReader так что поля в каждой строке могут быть доступны как,row['id']row['name']и т.д. Это также пропустит первый ряд для нас:


with open('my_csv.csv') as csv_file:
   for row in csv.DictReader(csv_file):
       # do work

Для экспорта в формате JSON используйтеjson модуль.json.dumps() возьмет структуры данных Python, такие как списки и словари, и вернет соответствующую строку JSON:

import json
my_data = {'id': 123, 'name': 'Test User', 'emails': ['[email protected]', '[email protected]']}
my_data_json = json.dumps(my_data)

Если вы хотите сгенерировать вывод JSON именно так, как вы разместили, вы 'сделать что-то вроде:

output = {'persons': []}
with open('my_csv.csv') as csv_file:
    for person in csv.DictReader(csv_file):
        output['persons'].append({
            'type': 'config.profile',
            'id': person['id'],
            # ...add other fields (email etc) here...
        })

        # ...do similar for config.pictures, config.status, etc...

output_json = json.dumps(output)

output_json будет содержать вывод JSON, который вы хотите.

Однако я'Я рекомендую вам внимательно рассмотреть структуру вывода JSON, которую выпосле - в данный момент выопределение внешнего словаря, который не имеет смысла, и выдобавляешь все своиconfig данные прямо под ''persons - Вы можете пересмотреть это.

Ваш ответ на вопрос