3

csv.Dictreader用来读取 csv 文件,因为通过字段名访问项目非常方便,但是csv.Dictwriter该类对如何处理字段名非常挑剔。"dict contains fields not in fieldnames"当我特别不希望 dict 包含我提供的所有字段名时,我得到了很多例外。我还希望能够提供一个字段名列表,其中的键可能不会出现在字典列表的每一行中。

因此,我创建了一种将字典列表转换为可以与该csv.writer.writerow函数一起使用的二维数组的方法。

问题:

我想知道我的方法是好是坏还是丑陋。是否有更好/更 Pythonic 的方式将具有任意字段名的字典列表转换为二维数组?我错过了一些明显的东西csv.DictWriter吗?

代码:

它的作用是:

输出将跳过您未提供的字段名,但如果您提供的字段名未出现在每一(或任何)行中,但仍将其包含在顶部的标题中,则输出也将只放置一个空格.csv 文件。

def csvdict_to_array(dictlist, fieldnames):
    # Start with header row
    csv_array = [fieldnames]

    for row in dictlist:
        csv_array.append(dictlist_row_to_list(row, fieldnames))

    return csv_array

def dictlist_row_to_list(dictlist_row, fieldnames):
    csv_row = []

    for field in fieldnames:
        if field not in dictlist_row:
            csv_row.append('')
        else:
            csv_row.append(dictlist_row[field])

    return csv_row

样本输入/输出:

fieldnames = ["one", "three", "ten"]
dictlist = [{"one": "bob", "two": "bill", "three":"cat"},
            {"one": "john", "two": "jack", "ten":"dog"}]

Output:
one,three,ten
bob,cat,
john,,dog

谢谢你的时间

4

1 回答 1

4

这会产生您的输出:

fieldnames = ["one", "three", "ten"]
dictlist = [{"one": "bob", "two": "bill", "three":"cat"},
            {"one": "john", "two": "jack", "ten":"dog"}]

res = [[item.get(key, '') for key in fieldnames] for item in dictlist]
res.insert(0, fieldnames)
print(res)

结果:

[['one', 'three', 'ten'], ['bob', 'cat', ''], ['john', '', 'dog']]
于 2013-06-03T16:49:34.570 回答