2009-07-29 13 views
3

CSVファイルから複数の行を抽出して別の行に書き込もうとしていますが、いくつか問題があります。私はドンが間違っているものをPython CSV DictReader/Writer issues

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 

全くわからない:

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() 

これを実行すると、私は次のエラーを取得します。

答えて

13

どちらもわかりませんが、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) 
+0

ブリリアントに記載されています。私は事を過度に複雑にする傾向があります。ありがとう。 – saturdayplace

+0

この回答は素晴らしい問題です。なぜなら、根本的な問題に対処しているからです。) – Jaykul

1

は、この行のようになります。

w = csv.DictWriter(united, fieldnames=fieldnames) 

は、あなたがエラーを取得している理由は、その最も可能性が高いです

w = csv.DictWriter(target, fieldnames=fieldnames) 
1

する必要があります元のCSVファイル(my_csv_file.csv)にはヘッダー行がありません。したがって、readerオブジェクトを作成すると、フィールド名フィールドはNoneに設定されます。

ライターを使用して行を書き込もうとすると、最初に、既知のフィールドのリストにないキーが辞書内に存在しないことが確認されます。 fieldnamesNoneに設定されているため、キー名を逆参照しようとすると例外がスローされます。

13

エラーの混乱を解決するにはrを使用して初めて入力ファイルから読み取るとr.fieldnamesが設定されるだけです。したがって、あなたが書いた方法では、fieldnamesは常にNoneに初期化されます。

w = csv.DictWriter(united, fieldnames=fieldnames)r.fieldnamesに初期化する場合は、最初の行をrから読み取った後でなければなりません。つまり、コードを再構成する必要があります。

この動作はPython Standard Library documentation

DictReader objects have the following public attribute:

csvreader.fieldnames

If not passed as a parameter when creating the object, this attribute is initialized upon first access or when the first record is read from the file.

+1

この回答は素晴らしいです... – Jaykul