質問

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 に設定されているため、キー名を逆参照しようとすると例外がスローされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top