gpt4 book ai didi

python - 在 Python 中检查 CSV 的第一个单元格是否为空

转载 作者:行者123 更新时间:2023-12-01 07:32:02 25 4
gpt4 key购买 nike

我正在尝试将字典写入 CSV。它处于循环中,因此循环中的每次迭代都应将最新的字典附加到 CSV 的末尾。

我想添加一个功能,如果文件为空,我只将标题写入 CSV。

我尝试使用f.tell()来检查它是否位于第一个位置,但它似乎不一致。我删除所有内容并将光标设置到第一个单元格并保存文件,有时会返回 2,其他则返回 0。

我正在考虑将数据更改为这样的列表,这样我就可以执行data[1][0]:

data=list(csv.reader(csvDataFile))

然后使用 if 语句来查看第一个位置是否为空,但这感觉效率低下(如果不是,请告诉我,我会坚持这样做)。这是这里的代码片段。有没有更有效、更清晰的方法来做到这一点?

with open('DataOutput.csv', 'a', newline='') as f:
writer = csv.DictWriter(f, sorted_closes.keys())
print(f.tell())
if f.tell() == 0:
writer.writeheader()
writer.writerow(sorted_closes)
else:
writer.writerow(sorted_closes)

我的解决方案:

如果有人遇到同样的问题。我最终只是使用 try/except 来处理文件为空的情况。

因为 newline='' 会(出于某种原因)在第 2 行开始输出。这些建议的方法都不起作用。如果我在空文件中查找从第 2 行开始的行,它将抛出 IndexError。如果我尝试使用 csv.Sniffer.has_header 方法,它永远不会返回 True,因为 header 始终位于第 2 行。

无论如何,这最终对我有用。不确定这是否是最有效的方法,但它有效:

    with open(filename + '.csv', 'a', newline='') as csv_a, open(filename + '.csv','r', newline='') as csv_r:
reader = csv.reader(csv_r)
writer = csv.DictWriter(csv_a, dict.keys())
data = [row for row in reader]

try:
first_row_blank = True if data[1] == [] else False

except IndexError:
first_row_blank = True

if first_row_blank:
writer.writeheader()
writer.writerow(dict)
else:
writer.writerow(dict)

最佳答案

最简单的方法可能是尝试读取第一行:

has_headers = True
# Assumes the file exists
with open('DataOutput.csv') as f:
reader = csv.reader(f)
try:
headers = next(reader)
except StopIteration:
has_headers = False
# Open in append mode and add headers if necessary

或者,如果您删除文件而不只是清除它,您可以尝试创建它并每次写入 header 。

try: 
# Open in exclusive creation mode
with open('DataOutput.csv', 'x') as f:
writer = csv.writer(f)
writer.writerow(headers)
except FileExistsError:
pass

with open('DataOutput.csv', 'a') as f:
...

关于python - 在 Python 中检查 CSV 的第一个单元格是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57168608/

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