python - dict到csv文件的嵌套列表

时间:2015-01-18 21:31:46

标签: python json csv dictionary

我尝试从两个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文件,但我的尝试失败了。

感谢您的帮助。

2 个答案:

答案 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字典的值时,你应该指定 按键顺序
  • 如果列的长度不同,您想要做什么(在您的示例中,有val1val3,但只有两个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对象