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

附注如下:

  • 当您 zipping 字典的值时,您应该指定 键的顺序
  • 如果列的长度不同(在您的示例中,有 val1val3,但只有两个 otherval,您想要做什么?也许像 padding all lists to fit the longest list?