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

标签 python csv dictionary

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

相关文章:

jquery - JVectorMap 的 map ?

C++ 计数图

python - 如何限制Python列表中元素的数量

c++ - Pythonic 方法来创建 vector vector 的空映射

c++ - 在myfile中未在此范围内声明

java - 列表 : pros/cons of this design pattern 中的 JAXB XmlJavaTypeAdapter 映射

python - Bokeh :同步链接图中的悬停工具提示

Python - 计算 Pandas 数据框中的非字母数字字符

java - 加载 csv 文件抛出 NullPointerException

PHP CSV 导入问题