如何通过循环嵌套字典来创建.csv文件

时间:2015-04-20 07:30:45

标签: python for-loop dictionary

我有一个字典(my_dict),其中包含多个键/值对字典(按编号索引),我正在尝试在每个字典中创建值的.csv文件,以便每个字典的值都在一个.csv文件的一行。

以下代码成功打印第一个字典,其中键作为标题,以及下面行中的值。然后,我实现了一个计数器(因为字典被字典编号索引),并且这成功地将附加的字典值写入文件的下一行。但是,我正在努力产生一个for循环,它将继续向该数字添加“1”,直到最后一个编号的字典(这取决于文件,但它们可以包含数百个)。有没有比复制和粘贴更有效的方法呢?我知道到目前为止一定有但是没有成功。

感谢!!!!

import csv
number = 1 

with open('mycsvfile.csv', 'wb') as f:  # Just use 'w' mode in 3.x
    rec = my_dict[str(number)]
    w = csv.DictWriter(f, rec.keys())
    w.writeheader()
    w.writerow(rec)
    number= number + 1
    rec = my_dict[str(number)]
    w = csv.DictWriter(f, rec.keys())
    w.writerow(rec)
    number= number + 1
    rec = my_dict[str(number)]
    w = csv.DictWriter(f, rec.keys())
    w.writerow(rec)
    number= number + 1

(等到数字是最高的字典数...需要一遍又一遍地重新粘贴这部分)

3 个答案:

答案 0 :(得分:1)

嗯,最简单的循环就是缩进整个重复的东西并在其周围加while True:

number = 1 

with open('mycsvfile.csv', 'wb') as f:  # Just use 'w' mode in 3.x
    while True:
        rec = my_dict[str(number)]
        w = csv.DictWriter(f, rec.keys())
        if number == 1: w.writeheader()
        w.writerow(rec)
        number= number + 1

这几乎可行 - 除了你永远不会退出循环。

那么,你知道什么时候吗?你知道提前的最高人数吗?如果是这样的话:

with open('mycsvfile.csv', 'wb') as f:  # Just use 'w' mode in 3.x
    for number in range(1, highest_number + 1):
        rec = my_dict[str(number)]
        w = csv.DictWriter(f, rec.keys())
        if number == 1: w.writeheader()
        w.writerow(rec)

或者你继续前进,直到在dict中找不到其中一个数字?然后:

number = 1
with open('mycsvfile.csv', 'wb') as f:  # Just use 'w' mode in 3.x
    while True:
        try:
            rec = my_dict[str(number)]
        except KeyError:
            break
        w = csv.DictWriter(f, rec.keys())
        if number == 1: w.writeheader()
        w.writerow(rec)
        number += 1

或者,因为你的键只是整数的字符串表示,所以只需将dict项排序为整数:

with open('mycsvfile.csv', 'wb') as f:  # Just use 'w' mode in 3.x
    for key, rec in sorted(my_dict.items(), key=int):
        w = csv.DictWriter(f, rec.keys())
        if key == 1: w.writeheader()
        w.writerow(rec)

无论规则是什么,它应该很容易写,但不知道规则,这是不可能的......


值得注意的是,使用DictWriter的全部意义在于您的所有词组都具有相同的键,因此您使用单个DictWriter而不是为每行创建一个新词......

答案 1 :(得分:0)

我可能错过了一些东西。你试过了吗?

import csv
NUMBER_MAX = 100 #guessing
f = open('mycsvfile.csv', 'wb')
for number in range(1,NUMBER_MAX+1):
    rec = my_dict[str(number)]
    w = csv.DictWriter(f, rec.keys())
    if number == 1:
         w.writeheader()
    w.writerow(rec)

当然,如果你可以在for循环之外编写headder,那就更好了。但是我会把它留给你。

注意我没有尝试运行此代码(可能存在拼写错误/语法错误)

答案 2 :(得分:0)

这是使用Pandas的优雅解决方案:

import pandas as pd

pd.DataFrame(my_dict).to_csv('mycsvfile.csv')

Pandas可以将dicts的dict转换为DataFrame。然后to_csv方法将其写入csv。您可能必须使用参数来准确获取所需内容,例如是否要写入键还是只读取值。 使用默认参数,第一行包含外键,内键将构成第一列。