python - 在 Python 中检查 CSV 的第一个单元格是否为空白
问题描述
我正在尝试将字典写入 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
,因为标题总是在第 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
或者,如果您删除文件而不仅仅是清除它,您可以尝试创建它并每次写入标题。
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 - 如何将输出输入到 tkinter 输入字段
- c# - Unity 错误:禁用设置驻留在预制资产中的转换的父级以防止数据损坏
- java - 用 Java 对扑克牌进行分类
- java - 比较几个元素的参数后打印出正确的组合
- memory-leaks - Leak Canary 在分离片段上检测到一些内存泄漏
- apache - 在 apache2 上托管多个网站
- javascript - 使用计算 Javascript 获取字符串以显示
- stored-procedures - SSRS:在存储过程数据集中查找值以确定要显示的图形
- c# - 使用 C# 发送电子邮件
- interface - 使用 Mockito 模拟接口返回 NullPointerException