Как обнаружить недостающие поля в файле CSV на Pythonic?

Я пытаюсь разобрать CSV-файл с использованием модуля csv Python (в частности, класса DictReader ). Существует ли метод 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 Solutions collect form web for “Как обнаружить недостающие поля в файле CSV на Pythonic?”

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

Изменить : Еще лучше:

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

Поскольку None и пустые строки оцениваются как False , вы должны учитывать следующее:

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

Обратите внимание, что, в отличие от некоторых других ответов, у вас все еще будет возможность повысить информативную ошибку заголовка.

Что-то вроде этого?

 ... 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:» в качестве теста вместо более явного теста, который вы дали.

Этот код предоставит для каждой строки список имен полей, которые не присутствуют (или пусты) для этой строки. Затем вы можете предоставить более подробное исключение, например «Недостающие поля: 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 

Если вы используете matplotlib.mlab.csv2rec, он уже сохраняет содержимое файла в массив и вызывает ошибку, если одно из значений отсутствует.

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

Проблема в том, что нет простого способа настроить это поведение или указать значение по умолчанию в случае отсутствия строк. Кроме того, сообщение об ошибке не очень объяснимо (может быть полезно опубликовать здесь отчет об ошибке).

ps, так как csv2rec сохраняет содержимое файла в запись numpy, будет легче получить значения равными None.

  • Python: другой объект «NoneType» не имеет ошибки атрибута
  • NumPy: возвращает 0 с делением на ноль
  • Управление пустым списком / недопустимым вводом при поиске максимального / минимального значения списка (Python)
  • AttributeError: модуль 'tensorflow.models.embedding.gen_word2vec' не имеет атрибута 'skipgram_word2vec'
  • Python urllib2 не может открыть localhost на альтернативном порту (не 80)? Ошибка 10013
  • Python - лучший язык программирования в мире.