-6

说我有两个字典

dict1 = {'name':'Leo','age':'15','tel':'123456789'}
dict2 = {'name':'Zac','age':'20','tel':'987654321'}

我想将这两个字典写入 csv 文件。我可以将一个字典写入一个标题位于表顶部的 csv 文件,但是当我将第二个字典添加到同一个 csv 文件时,它会在最后一次输入之后写入另一个标题。所以我想知道是否有办法检查标题是否已经存在,如果没有,添加标题,否则只需添加新的字典数据

4

2 回答 2

5

不清楚你的问题是什么,所以我将不得不猜测。如果你想要一个更具体的答案,而不是模糊的概括,你需要写一个更具体的问题。

我怀疑你有这样的代码:

with open('output.csv', 'w') as f:
    dw = csv.DictWriter(f, ('name', 'age', 'tel'))
    dw.writeheader()
    dw.writerow(dict1)

with open('output.csv', 'a') as f:
    dw = csv.DictWriter(f, ('name', 'age', 'tel'))
    dw.writeheader()
    dw.writerow(dict2)

问题是您的输出如下所示:

name,age,tel
Leo,15,123456789
name,age,tel
Zac,20,987654321

当你想要这个时:

name,age,tel
Leo,15,123456789
Zac,20,987654321

如果是这样,解决这个问题的正确方法是不要writeheader第二次打电话。根据您的代码的结构,这可能就像不在某处调用它一样简单。

但是假设你有一些包装函数,像这样:

def add_to_csv(row):
    with open('output.csv', 'a') as f:
        dw = csv.DictWriter(f, ('name', 'age', 'tel'))
        dw.writeheader()
        dw.writerow(row)

而且您无法更改它,并且您希望它仅在文件为空时才写入标题。

有几种不同的方法可以判断文件是否为空。鉴于您已在'a'模式下打开文件,一个简单的方法就是检查它f.tell()是否为非零。或者你可以检查它os.fstat(f.fileno()).st_size是非零的。

但是,如果您在程序的一次运行中完成所有写入,那么只在脚本中跟踪可能会更干净。同样,您可以将openandDictWriter代码移到实例/全局级别,而不是函数/方法的本地。或者您可以添加一个实例/全局标志来跟踪您是否已调用writeheader

于 2013-08-05T21:11:24.767 回答
0

当然

headers_that_do_not_exist = set(dict2.keys()) - set(dict1.keys())
于 2013-08-05T20:57:35.277 回答