3

私は以前に使用したことがありませんが、使用するのcsv modulepython十分便利です。

問題は、読み込もうとしている CSV ファイルに、時々ヘッダー (インデックス) が含まれていることです。

このようなもの:

A, B, C, D, E, F
1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6
A, B, C, D, E, F
1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6
A, B, C, D, E, F
1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6
1, 2, 3, 4, 5, 6

をそのまま使用できますかcsv module、それとも自分で解析する必要がありますか。

4

1 に答える 1

6

ヘッダー行を読むだけかどうかを確認するだけで、そのまま使用できます。たとえば、 を使用するDictReaderと、次のことができます。

with open('file.csv') as f:
    reader = csv.DictReader(f)
    lines = [row for row in reader
             if not all(k == v for k, v in row.iteritems())]

サンプルファイルでこれが機能する方法は次のとおりです。

  1. コンストラクターは最初のDictReaderヘッダー行を読み取り、フィールドの名前が"A", "B", "C", "D", "E", "F".
  2. を繰り返すとreader、 のような辞書が返されます{"A": "1", "B": "2", ...}
  3. のリスト内包表記はlines、各行ディクショナリを調べます。最初に のような辞書が表示されます{"A": "1", ...}all(k == v for k, v in row.iteritems())行のキーと値をループし、たとえばk = "A"andを設定しv = "1"ます。ディクショナリがどのように反復するかによって、どちらが最初に検出されたとしても、 が表示されるk != vため、all()呼び出しは になりますFalse。つまり、行がリストに追加されますlines
  4. ヘッダー行が繰り返されると、 のような辞書が表示されます{"A": "A", "B": "B", ...}。次に、キーは各ディクショナリ要素の値と等しいため、all()呼び出しは を返しTrue、リスト内包表記の条件は になりますFalse。これは、行が最終的なリストに含まれないことを意味します。.strip()ヘッダー行の間隔が異なる可能性がある場合は、呼び出しで比較する前にキー/値を呼び出す必要があることに注意してくださいall()
  5. 最後に、サンプル ファイルは;linesと等しくなります。[{"A": 1, "B": 2, ...}] * 9繰り返されるヘッダー行は削除されました。

一度に 1 つのリストに読み込むのではなく、ファイルを 1 行ずつ処理したい場合は、 のリスト内包lines表記をジェネレーター式に変更する[row for row ...]だけ(row for row ...)です。その後、 をループできますが、ループしlinesた後は各行が忘れられます (for row in reader最初に行った場合のように)。

于 2013-01-17T00:06:12.880 に答える