python - 字典中的嵌套列表到 csv 文件
python - Nested list in dict to csv files
我试图从两个 json 文件创建一个 csv 文件。
第一个 json 文件:
{ "attributes": [
{
"code": "ean",
"description": "the ean",
"example": null,
"hierarchy_code": null,
"label": "ean",
"required": true,
"type": "TEXT",
"type_parameter": null,
"values": null,
"values_list": "some value"
},
...
第二个 json 文件:
{
"code": "the code",
"label": "shoes",
"values": [
{
"code": "COL_100",
"label": "white"
},
{
"code": "COL_101",
"label": "blue"
},
...
我需要从第一个 json 中的键 "values_list" 获取值。
使用该键,我可以从第二个 json 中获取一个列表(其中 return 是一个随机值)并获取 "label" 键值。
我发现像这样制作两个循环:
for att in first_json['attributes']:
csv_dict[att['values_list']] = []
for val in second_json['values']:
csv_dict[att['values_list']].append(val['label'])
创建如下字典:
{'label1': [val1, val2, val3],
'label2': [otherval1, otherval2, ...],
...}
我的问题:
使用我的 "csv_dict" 字典,如何创建结构如下的 csv:
label1 | label2 | ... | labeln
val1 | otherval1 | ... | valn
val2 | otherval2 | ... |
val3 | ... | ... |
我的实际字典似乎不适合通常使用 csv.Dictwriter() 方法。
https://docs.python.org/2/library/csv.html#csv.DictWriter
我尝试像这样使用 zip 功能:
for elem in zip(*labels.values()):
data.append(";".join([otherelm for otherelem in elem]))
希望手动创建一个 csv 文件,但我的尝试失败了。
感谢您的帮助。
好的,我看到你更新了你的问题,所以它给出了完全不同的含义。试试这个:
import csv
labels = {
'label1': ["val1", "val2", "val3"],
'label2': ["otherval1", "otherval2", "otherval3"]
}
keys = [k for k in labels]
with open('file.csv', 'wb') as f
w = csv.DictWriter(f, keys)
w.writeheader()
for group in zip(*labels.values()):
temp = {}
for i in group:
temp[keys[group.index(i)]] = i
w.writerow(temp)
试试这个,它应该适用于任何大小的 json 对象
从您的 csv_dict
开始,您可以执行类似
的操作
import csv
import itertools
csv_dict = {'label1': ['val1', 'val2', 'val3'],
'label2': ['otherval1', 'otherval2'],
'label3': ['yetanotherval1']}
keys = csv_dict.keys()
csvrows = itertools.izip_longest(*[csv_dict[k] for k in keys], fillvalue='dummy')
with open('out.csv', 'w') as csvfile:
csvwriter = csv.writer(csvfile, delimiter=';',
quotechar='\', quoting=csv.QUOTE_MINIMAL)
csvwriter.writerow(keys)
for row in csvrows:
csvwriter.writerow(row)
结果out.csv
:
label1;label2;label3
val1;otherval1;yetanotherval1
val2;otherval2;dummy
val3;dummy;dummy
附注如下:
- 当您
zip
ping 字典的值时,您应该指定
键的顺序
- 如果列的长度不同(在您的示例中,有
val1
到 val3
,但只有两个 otherval
,您想要做什么?也许像 padding all lists to fit the longest list?
我试图从两个 json 文件创建一个 csv 文件。
第一个 json 文件:
{ "attributes": [
{
"code": "ean",
"description": "the ean",
"example": null,
"hierarchy_code": null,
"label": "ean",
"required": true,
"type": "TEXT",
"type_parameter": null,
"values": null,
"values_list": "some value"
},
...
第二个 json 文件:
{
"code": "the code",
"label": "shoes",
"values": [
{
"code": "COL_100",
"label": "white"
},
{
"code": "COL_101",
"label": "blue"
},
...
我需要从第一个 json 中的键 "values_list" 获取值。 使用该键,我可以从第二个 json 中获取一个列表(其中 return 是一个随机值)并获取 "label" 键值。
我发现像这样制作两个循环:
for att in first_json['attributes']:
csv_dict[att['values_list']] = []
for val in second_json['values']:
csv_dict[att['values_list']].append(val['label'])
创建如下字典:
{'label1': [val1, val2, val3],
'label2': [otherval1, otherval2, ...],
...}
我的问题:
使用我的 "csv_dict" 字典,如何创建结构如下的 csv:
label1 | label2 | ... | labeln
val1 | otherval1 | ... | valn
val2 | otherval2 | ... |
val3 | ... | ... |
我的实际字典似乎不适合通常使用 csv.Dictwriter() 方法。
https://docs.python.org/2/library/csv.html#csv.DictWriter
我尝试像这样使用 zip 功能:
for elem in zip(*labels.values()):
data.append(";".join([otherelm for otherelem in elem]))
希望手动创建一个 csv 文件,但我的尝试失败了。
感谢您的帮助。
好的,我看到你更新了你的问题,所以它给出了完全不同的含义。试试这个:
import csv
labels = {
'label1': ["val1", "val2", "val3"],
'label2': ["otherval1", "otherval2", "otherval3"]
}
keys = [k for k in labels]
with open('file.csv', 'wb') as f
w = csv.DictWriter(f, keys)
w.writeheader()
for group in zip(*labels.values()):
temp = {}
for i in group:
temp[keys[group.index(i)]] = i
w.writerow(temp)
试试这个,它应该适用于任何大小的 json 对象
从您的 csv_dict
开始,您可以执行类似
import csv
import itertools
csv_dict = {'label1': ['val1', 'val2', 'val3'],
'label2': ['otherval1', 'otherval2'],
'label3': ['yetanotherval1']}
keys = csv_dict.keys()
csvrows = itertools.izip_longest(*[csv_dict[k] for k in keys], fillvalue='dummy')
with open('out.csv', 'w') as csvfile:
csvwriter = csv.writer(csvfile, delimiter=';',
quotechar='\', quoting=csv.QUOTE_MINIMAL)
csvwriter.writerow(keys)
for row in csvrows:
csvwriter.writerow(row)
结果out.csv
:
label1;label2;label3
val1;otherval1;yetanotherval1
val2;otherval2;dummy
val3;dummy;dummy
附注如下:
- 当您
zip
ping 字典的值时,您应该指定 键的顺序 - 如果列的长度不同(在您的示例中,有
val1
到val3
,但只有两个otherval
,您想要做什么?也许像 padding all lists to fit the longest list?