2009-08-14 5 views
8

파이썬의 csv 모듈 (특히 DictReader 클래스)을 사용하여 CSV 파일을 구문 분석하려고합니다. 비어 있거나 누락 된 필드를 감지하고 오류를 던질 Pythonic 방법이 있습니까?Python 방식으로 CSV 파일에서 누락 된 필드를 어떻게 검색합니까?

이 다음은 샘플 다음 헤더를 사용하여 파일의 : VALUE

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

분석 NAME, LABEL, 나는 그것이 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 문장을 포함하고 있습니까? 필드를 더 추가해야하는 경우 더 많은 조건문이 필요하며 가능한 경우이를 피하고 싶습니다.

답변

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

편집 : 더 나은 : False

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

달콤한 Pythonic 방법! –

+0

이 방법은 csv.DictReader의 동작과 거의 호환되지 않습니다. HEADERS에서 명시 적으로 언급되지 않았기 때문에 DictReader에 의해 일부가 삭제 될 수 있지만 행의 모든 ​​키를 통해 반복됩니다. http://docs.python.org/library/csv.html#csv.DictReader – Triptych

+0

@Triptych : 이러한 추가 키는 최대 하나 (값은 생성자에 대한 restkey로 전달됨)입니다. 나는 그 문제를 보지 못했다. – balpha

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 

더 명확한 테스트 대신 테스트로 '가치가 없다면 :'을 사용할 수 있습니다.

2

이후 None과 빈 문자열을 모두 평가하고,이 사항을 고려해야합니다

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

참고, 그 몇 가지 다른 답변과는 달리 유익한 헤더 별 오류를 제기 할 수 있습니다.

+0

어떤 열에도 숫자 0 값이 있고'quoting'이'csv.QUOTE_NONNUMERIC'으로 설정되면 위양성으로 이어질 것입니다. –

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 
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 값을 얻는 것이 더 쉬울 것입니다.

관련 문제