Как я могу конвертировать JSON в CSV?

UPD: с VS2017 в Work Tools есть рабочая нагрузка, которая полностью устраняет эту проблему. См. Ответ @SOReader.

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

<Import Project="$(SolutionDir)\BuildTargets\WebApplications\Microsoft.WebApplication.targets" />
<Import Condition="false" Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

Первая строка - это фактический импорт из нового местоположения, относящегося к каталогу решений. Второй вариант - отключенная версия (Condition="false") исходной строки, которая позволяет Visual Studio по-прежнему считать ваш проект действительным проектом веб-приложений (это трюк, который сам VS 2010 SP1).

Не забудьте скопировать папку C:\Program Files (x86)\Microsoft\VisualStudio\v10.0\WebApplications в BuildTargets под вашим контролем источника.

149
задан martineau 27 September 2016 в 11:46
поделиться

4 ответа

Используйте json_normalize от [1 112] pandas :

import pandas as pd
from pandas.io.json import json_normalize
from pathlib import Path
import json

# set path to file
p = Path(r'c:\some_path_to_file\test.json')

# read json
with p.open('r', encoding='utf-8') as f:
    data = json.loads(f.read())

# create dataframe
df = json_normalize(data)

# dataframe view
 pk            model  fields.codename           fields.name  fields.content_type
 22  auth.permission     add_logentry     Can add log entry                    8
 23  auth.permission  change_logentry  Can change log entry                    8
 24  auth.permission  delete_logentry  Can delete log entry                    8
  4  auth.permission        add_group         Can add group                    2
 10  auth.permission      add_message       Can add message                    4

# save to csv
df.to_csv('test.csv', index=False, encoding='utf-8')

Вывод CSV:

pk,model,fields.codename,fields.name,fields.content_type
22,auth.permission,add_logentry,Can add log entry,8
23,auth.permission,change_logentry,Can change log entry,8
24,auth.permission,delete_logentry,Can delete log entry,8
4,auth.permission,add_group,Can add group,2
10,auth.permission,add_message,Can add message,4

Другие Ресурсы для в большей степени вложенных объектов JSON:

1
ответ дан 23 November 2019 в 21:24
поделиться

Этот код должен работать для вас, предполагая, что ваши данные JSON находятся в файле с именем data.json .

import json
import csv

with open("data.json") as file:
    data = json.load(file)

with open("data.csv", "w") as file:
    csv_file = csv.writer(file)
    for item in data:
        fields = list(item['fields'].values())
        csv_file.writerow([item['pk'], item['model']] + fields)
23
ответ дан 23 November 2019 в 21:24
поделиться

JSON может представлять широкий спектр структур данных - «объект» JS примерно похож на dict Python (со строковыми ключами), «массив» JS примерно как список Python и вы можете вкладывать их, если конечные «листовые» элементы являются числами или строками.

CSV может по существу представлять только двухмерную таблицу - необязательно с первой строкой «заголовков», то есть «имен столбцов», что может сделать таблицу интерпретируемой как список dicts, вместо обычной интерпретации, списка списков (опять же, «листовые» элементы могут быть числами или строками).

Таким образом, в общем случае вы не можете переводить произвольную структуру JSON в CSV. В некоторых особых случаях вы можете (массив массивов без дальнейшего вложения; массивы объектов, которые все имеют одинаковые ключи). Какой особый случай, если есть, относится к вашей проблеме? Детали решения зависят от того, какой у вас особый случай. Учитывая тот удивительный факт, что вы даже не упоминаете, какое из них применяется, я подозреваю, что вы, возможно, не учли ограничение, ни один из применимых случаев на самом деле не применяется, и вашу проблему невозможно решить. Но, пожалуйста, уточните!

35
ответ дан 23 November 2019 в 21:24
поделиться

Во-первых, ваш JSON имеет вложенные объекты, поэтому его обычно нельзя напрямую преобразовать в CSV. Вам нужно изменить это на что-то вроде этого:

{
    "pk": 22,
    "model": "auth.permission",
    "codename": "add_logentry",
    "content_type": 8,
    "name": "Can add log entry"
},
......]

Вот мой код для генерации CSV из этого:

import csv
import json

x = """[
    {
        "pk": 22,
        "model": "auth.permission",
        "fields": {
            "codename": "add_logentry",
            "name": "Can add log entry",
            "content_type": 8
        }
    },
    {
        "pk": 23,
        "model": "auth.permission",
        "fields": {
            "codename": "change_logentry",
            "name": "Can change log entry",
            "content_type": 8
        }
    },
    {
        "pk": 24,
        "model": "auth.permission",
        "fields": {
            "codename": "delete_logentry",
            "name": "Can delete log entry",
            "content_type": 8
        }
    }
]"""

x = json.loads(x)

f = csv.writer(open("test.csv", "wb+"))

# Write CSV Header, If you dont need that, remove this line
f.writerow(["pk", "model", "codename", "name", "content_type"])

for x in x:
    f.writerow([x["pk"],
                x["model"],
                x["fields"]["codename"],
                x["fields"]["name"],
                x["fields"]["content_type"]])

Вы получите вывод как:

pk,model,codename,name,content_type
22,auth.permission,add_logentry,Can add log entry,8
23,auth.permission,change_logentry,Can change log entry,8
24,auth.permission,delete_logentry,Can delete log entry,8
115
ответ дан 23 November 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: