首页 > 解决方案 > 在 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)

标签: pythoncsvdictionary

解决方案


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

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:
    ... 

推荐阅读