我尝试从两个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"
},
...
我需要从密钥" values_list"中获取值。在第一个json。 使用该键,我可以从第二个json(返回一个随机数量的值)中获取一个列表并使用"标签"关键价值。
我发现的是制作两个这样的循环:
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文件,但我的尝试失败了。
感谢您的帮助。
答案 0 :(得分:0)
从您的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
s?也许像padding all lists to fit the longest list?答案 1 :(得分:-1)
好的,我看到你更新了你的问题,所以它给出了另一个意思。试试这个:
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对象