gpt4 book ai didi

python - 使用 'a' 方法写入 csv : headers and new values

转载 作者:太空宇宙 更新时间:2023-11-04 05:36:50 25 4
gpt4 key购买 nike

我正在使用 'a' 附加方法打开一个 csv 文件,以使用 DictWriter(仅从每次调用中写入一个新行)。

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

values = [18, 20, 3, 9] ##每次函数运行时更改

每次我玩函数时,值都会改变。键通常保持不变,但由于我正在从 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 如下所示:

15000, 15001, 15002, 15003  
18, 20, 3, 9
15000, 15001, 15002, 15003
20, 15, 4, 12

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

附言请注意,我添加了 lineterminated = '\n' para,因为默认的 DictWriter 方法在每个追加时创建一个空行。

最佳答案

听起来您需要在列更改时重写整个 CSV 文件。

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

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

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 文件,然后在稍后执行合并。

关于python - 使用 'a' 方法写入 csv : headers and new values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35315196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com