Вот шаблон моего JSON:
{
"field 1": [
{
"id": "123456"
},
{
"about": "YESH"
},
{
"can_post": true
},
{
"category": "Community"
}
],
"field 2": [
{
"id": "123456"
},
{
"about": "YESH"
},
{
"can_post": true
},
{
"category": "Community"
}
]
}
Я хотел бы преобразовать этот JSON в csv в следующем формате, используя Python:
0 field 1, id, about, can_post, category
1 field 2, id, about, can_post, category
Я попытался использовать pandas для read_json, а затем to_csv, но это не сработало.
Спасибо
import csv
import json
json.load(json_data) Deserialize json_data (json document (txt/binary file)) для объекта python.
with open('jsn.txt','r') as json_data:
json_dict = json.load(json_data)
так как ваши имена полей (ключи, которые будут действовать как имя поля) находятся внутри разных dicts, мы должны пройти через этот dicts и поместить их в список field_names
.
field_names = [ 'field']
for d in json_dict['field 1']:
field_names.extend(d.keys())
with open('mycsvfile.csv', 'w') as f:
w = csv.DictWriter(f, fieldnames = fieild_names)
w.writeheader()
for k1, arr_v in json_dict.items():
temp = {k2:v for d in arr_v for k2,v in d.items()}
temp['field'] = k1
w.writerow(temp)
Выход
field,id,about,can_post,category
field 1,123456,YESH,True,Community
field 2,123456,YESH,True,Community
Если вы обнаружите, что понимание диктата сбивает с толку
k1 : arr_v
'field 1' = [{ "id": "123456" },...{"category": "Community"}]
for d in arr_v:
k2 : v
d --> { "id": "123456" }
Жесткая часть здесь заключается в том, что исходная структура json - это не просто список отображений, а отображение, в котором значения, в свою очередь, представляют собой списки отображений.
IMHO, вы должны предварительно обработать свой ввод или обработать его элементом по элементу, чтобы получить список или сопоставление, которое может быть преобразовано в строку csv. Вот возможное решение, которое:
Код может быть:
import json
import csv
# read the json data
with open("input.json") as fd:
data = json.load(fd)
# extract the field names (using 'field' for the key):
names = ['field']
for d in next(iter(data.values())):
names.extend(d.keys())
# open the csv file as a DictWriter using those names
with open("output.csv", "w", newline='') as fd:
wr = csv.DictWriter(fd, names)
wr.writeheader()
for field, vals in data.items():
d['field'] = field
for inner in vals:
for k,v in inner.items():
d[k] = v
wr.writerow(d)
С вашими данными он дает:
field,id,about,can_post,category
field 1,123456,YESH,True,Community
field 2,123456,YESH,True,Community
как насчет этого, если у вас есть json подобные data
data = [
{
"site": "field1",
"id": "123456",
"about": "YESH",
"can_post": True,
"category": "Community"
},
{
"site": "field2",
"id": "123456",
"about": "YESH",
"can_post": True,
"category": "Community"
}
]
# also use True instead of true
df = pd.DataFrame.from_dict(data)
print(df)
# use df.to_csv('filename.csv') for csv
выход:
about can_post category id site
0 YESH True Community 123456 field1
1 YESH True Community 123456 field2
field1