2009-08-14 2 views
8

私はPythonのcsvモジュール(具体的には、DictReaderクラス)を使用してCSVファイルを解析しようとしています。空のフィールドや見つからないフィールドを検出してエラーを投げるPythonの方法はありますか? NAME、LABEL解析するとき、それはVALUEフィールドを欠けているので、私はエラーをスローするために第2ラインを希望 Pythonの方法でCSVファイルの欠損フィールドを検出するにはどうすればよいですか?

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文が含まれていますか?フィールドを追加する必要がある場合は、さらに条件式が必要になります。可能であれば、これを避けたいと考えています。

答えて

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

編集:さらに良い:

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

注いくつかの他の回答とは異なり、その:None以来

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

甘いパイソン様! –

+0

このメソッドは、csv.DictReaderの動作とほとんど互換性がありません。 HEADERSで明示的に言及されていないため、DictReaderによって破棄されるものもありますが、行のすべてのキーをループします。その他の情報:http://docs.python.org/library/csv.html#csv.DictReader – Triptych

+0

@Triptych:このような追加キーは最大で1つあります(値はコンストラクタに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 

あなたが与えたより明示的なテストの代わりに、テストでは「if not value:」を使用することができます。

2

と空の文字列の両方Falseに評価され、あなたはこれを考慮すべきです情報に基づいたヘッダー固有のエラーを発生させるオプションがあります。

+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にする方が簡単になります。

関連する問題