При использовании типа возврата IEnumerable
можно возвратить Ваш запрос переменная непосредственно.
if any(row[key] in (None, "") for key in row):
# raise error
Изменить : Еще лучше:
if any(val in (None, "") for val in row.itervalues()):
# raise error
Поскольку Нет
и пустые строки оба оцениваются как False
, вам следует принять во внимание следующее:
for row in reader:
for header in HEADERS:
if not row[header]:
# raise error
Обратите внимание, что, в отличие от некоторых других ответов, у вас все равно будет возможность вызвать информативную ошибку, связанную с заголовком.
Этот код предоставит для каждой строки список имен полей, которые отсутствуют (или являются пустыми) для этой строки. Затем вы можете указать более подробное исключение, например «Отсутствующие поля: 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
Что-то вроде этого?
...
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:' в качестве теста вместо более явного теста, который вы дали.
Если вы используете matplotlib.mlab.csv2rec, он уже сохраняет содержимое файла в массив и вызывает ошибку, если одно из значений отсутствует.
>>> from matplotlib.mlab import csv2rec
>>> content_array = csv2rec('file.txt')
IndexError: list index out of range
Проблема в том, что там - это непростой способ настроить это поведение или указать значение по умолчанию в случае отсутствия строк. Более того, сообщение об ошибке не очень объяснительно (может быть полезно опубликовать здесь отчет об ошибке).
ps, поскольку csv2rec сохраняет содержимое файла в виде numpy-записи, будет легче получить значения, равные None.