使用“a”方法写入csv:标题和新值

2024-09-30 20:31:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我用append方法'a'打开一个csv文件,用DictWriter(每次调用只写一个新行)作为函数调用的结果。在

keys = ['15000', '15001', '15002', '15003']

values = [18, 20, 3, 9] ##changes each time function run

每次我对函数感兴趣时,值都会改变。键通常保持不变,但当我从XML文件中提取时,将来可能会添加更多的键(与新值相关)。因此,我希望能够一致地将值映射到字段名。在

with open('myfile.csv', 'a') as csvfile:
    w = csv.DictWriter(csvfile, fieldnames = keys, lineterminator='\n')
    w.writerheader()
    w.writerow(dict(zip(fnames, values)))

这里的问题是每次writerheader()将头写到前一行下。生成的csv如下所示:

^{pr2}$

我不希望这个标题重复出现。我知道我可以从csv开始,只将初始键作为头,但是如果字典键在以后的函数调用中发生变化,这并不能解决我的问题。另外,如果添加了新的键,是否会一致地将值映射到键?我会遇到麻烦吗?在

{{cd2>添加了一个默认的


Tags: 文件csvcsvfile方法timefunctionkeyseach
1条回答
网友
1楼 · 发布于 2024-09-30 20:31:52

听起来好像每次列更改时都需要重写整个CSV文件。在

如果将新列追加到现有键,则当前数据行将需要追加一个空字段。或者,您可能有一些应该添加的默认值,而不是一个空字段。在

因此,您需要用DictReader打开现有的CSV文件。获取fieldnames并附加新列。然后从原始文件中读取每一行,可以选择使用新列的默认值更新字典。然后将其写入一个新文件,其中DictWriter配置了新的fieldnames。最后添加新行。在

import os
import shutil
from csv import DictReader, DictWriter
from tempfile import NamedTemporaryFile

def append_csv(csv_filename, data):
    with open(csv_filename, 'a+') as csv_file:
        reader = DictReader(csv_file)
        new_keys = set(data.keys()).difference(reader.fieldnames)
        if not new_keys:
            csv_file.seek(0, os.SEEK_END)
            writer = DictWriter(csv_file, reader.fieldnames)
            writer.writerow(data)
        else:
            reader.fieldnames.extend(sorted(new_keys))
            with NamedTemporaryFile(dir='.', delete=False) as csv_tmpfile:
                writer = DictWriter(csv_tmpfile, reader.fieldnames, lineterminator='\n')
                writer.writeheader()
                writer.writerows(row for row in reader)
                writer.writerow(data)
            shutil.move(csv_tmpfile.name, csv_filename)

如果字段经常更改,这将是非常低效的。相反,您可能希望在列更改时写入单独的CSV文件,然后在以后执行合并。在

相关问题 更多 >