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

时间:2009-08-14 16:10:36

标签: python error-handling csv

我正在尝试使用Python的csv模块(特别是DictReader类)解析CSV文件。是否有Pythonic方法来检测空字段或丢失字段并抛出错误?

以下是使用以下标题的示例文件: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 个答案:

答案 0 :(得分:17)

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

修改:更好:

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

答案 1 :(得分:2)

由于None和空字符串都评估为False,因此您应该考虑这一点:

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

请注意,与其他一些答案不同,您仍然可以选择提出信息性的,特定于标题的错误。

答案 2 :(得分: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:'作为测试,而不是您给出的更明确的测试。

答案 3 :(得分:1)

此代码将为每一行提供该行不存在(或为空)的字段名称列表。然后,您可以提供更详细的例外,例如“Missing fields:foo,baz”。

def missing(row):
    return [h for h in HEADERS if not row.get(h)]

for row in reader:
    m = missing(row)
    if missing:
        # raise exception with list of missing field names

答案 4 :(得分:0)

如果您使用matplotlib.mlab.csv2rec,它已将文件内容保存到数组中,如果缺少其中一个值,则会引发错误。

>>> from matplotlib.mlab import csv2rec
>>> content_array = csv2rec('file.txt')
IndexError: list index out of range

问题在于,没有一种简单的方法可以自定义此行为,或者在缺少行时提供默认值。此外,错误消息不是非常具有解释性(在此处发布错误报告可能很有用)。

P.S。由于csv2rec将文件的内容保存为numpy记录,因此将更容易使值等于None。