如何以 Pythonic 方式检测 CSV 文件中缺失的字段?

13 投票
5 回答
20303 浏览
提问于 2025-04-15 13:36

我正在尝试使用Python的csv模块(特别是DictReader类)来解析一个CSV文件。有没有什么Python风格的方法可以检测到空字段或缺失字段,并抛出错误呢?

这是一个示例文件,使用以下标题:NAME, LABEL, VALUE

foo,bar,baz
yes,no
x,y,z

在解析时,我希望第二行能抛出错误,因为它缺少了VALUE字段。

这里有一段代码,展示了我目前的处理方式(忽略那些硬编码的字符串……它们只是为了简洁):

import csv

HEADERS = ["name", "label", "value" ]
fileH = open('configFile')
reader = csv.DictReader(fileH, HEADERS)

for row in reader:
    if row["name"] is None or row["name"] == "":
        # raise Error
    if row["label"] is None or row["label"] == "":
        # raise Error
    ...
fileH.close()

有没有更简洁的方法来检查CSV文件中的字段,而不需要写一堆if语句?如果我需要添加更多字段,我也需要更多的条件判断,这样我希望尽量避免。

5 个回答

1

像这样吗?

...
for row in reader:
    for column, value in row.items():
        if value is None or value == "":
            # raise Error, using value of column to say which field is missing

你可以试试用 'if not value:' 这个方式来做判断,而不是你之前用的那种更明确的判断方式。

2

因为 None 和空字符串在判断时都被看作是 False,所以你需要考虑这一点:

for row in reader:
    for header in HEADERS:
        if not row[header]:
            # raise error

需要注意的是,与其他一些回答不同,你仍然可以选择抛出一个有用的、特定于头部的错误信息。

21
if any(row[key] in (None, "") for key in row):
    # raise error
if any(val in (None, "") for val in row.itervalues()):
    # raise error

编辑: 更好的方法是:

撰写回答