Python CSV DictReader / Writerの問題
質問
CSVファイルから多数の行を抽出して別の行に書き込もうとしていますが、問題があります。
import csv
f = open("my_csv_file.csv", "r")
r = csv.DictReader(f, delimiter=',')
fieldnames = r.fieldnames
target = open("united.csv", 'w')
w = csv.DictWriter(united, fieldnames=fieldnames)
while True:
try:
row = r.next()
if r.line_num <= 2: #first two rows don't matter
continue
else:
w.writerow(row)
except StopIteration:
break
f.close()
target.close()
これを実行すると、次のエラーが表示されます。
Traceback (most recent call last):
File "unify.py", line 16, in <module>
w.writerow(row)
File "C:\Program Files\Python25\lib\csv.py", line 12
return self.writer.writerow(self._dict_to_list(row
File "C:\Program Files\Python25\lib\csv.py", line 12
if k not in self.fieldnames:
TypeError: argument of type 'NoneType' is not iterable
何が間違っているのか完全にはわかりません。
解決
どちらもわかりませんが、1つのファイルから別のファイルに行をコピーするだけなので、 csv
に悩まされるのはなぜですか?次のようなものはなぜですか:
f = open("my_csv_file.csv", "r")
target = open("united.csv", 'w')
f.readline()
f.readline()
for line in f:
target.write(line)
他のヒント
エラーに関する混乱を解消するには: r.fieldnames
は r
を使用して初めて入力ファイルから読み込んだ場合にのみ設定されるため、エラーが発生します。したがって、あなたが書いた方法では、 fieldnames
は常に None
に初期化されます。
r から最初の行を読んだ後にのみ
r.fieldnames
で w = csv.DictWriter(united、fieldnames = fieldnames)
を初期化できますcode>、つまり、コードを再構築する必要があります。
この動作は、 Python標準ライブラリのドキュメントに記載されています。
DictReaderオブジェクトには、次のパブリック属性があります。
csvreader.fieldnames
オブジェクトの作成時にパラメーターとして渡されない場合、この属性は最初のアクセス時またはファイルから最初のレコードが読み取られたときに初期化されます。
例外については、次の行のようになります。
w = csv.DictWriter(united, fieldnames=fieldnames)
あるべき
w = csv.DictWriter(target, fieldnames=fieldnames)
エラーが発生する理由として、元のCSVファイル(my_csv_file.csv)にヘッダー行がないことが考えられます。したがって、リーダーオブジェクトを作成すると、そのfieldnamesフィールドは None
に設定されます。
ライターを使用して行を書き込もうとすると、まず、既知のフィールドのリストにないキーが辞書にないことを確認します。 fieldnames
は None
に設定されているため、キー名を逆参照しようとすると例外がスローされます。