我正在尝试将字典写入 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/