私はPythonを使ってcsvを編集するために下記のコードを使っています。コード内で呼び出される関数はコードの上部を形成します。
問題:以下のコードで2行目からcsvの編集を開始したいのですが、ヘッダーを含む1行目を除外したいのです。今は1行目にのみ関数を適用しており、私のヘッダ行は変更されています。
in_file = open("tmob_notcleaned.csv", "rb")
reader = csv.reader(in_file)
out_file = open("tmob_cleaned.csv", "wb")
writer = csv.writer(out_file)
row = 1
for row in reader:
row[13] = handle_color(row[10])[1].replace(" - ","").strip()
row[10] = handle_color(row[10])[0].replace("-","").replace("(","").replace(")","").strip()
row[14] = handle_gb(row[10])[1].replace("-","").replace(" ","").replace("GB","").strip()
row[10] = handle_gb(row[10])[0].strip()
row[9] = handle_oem(row[10])[1].replace("Blackberry","RIM").replace("TMobile","T-Mobile").strip()
row[15] = handle_addon(row[10])[1].strip()
row[10] = handle_addon(row[10])[0].replace(" by","").replace("FREE","").strip()
writer.writerow(row)
in_file.close()
out_file.close()
row
変数を1
に初期化することでこの問題を解決しようとしましたが、うまくいきませんでした。
この問題を解決するのを手伝ってください。
あなたのreader
変数はイテラブルです、それをループすることによって行を取得します。
ループの前の項目を1つスキップするには、 next(reader, None)
を呼び出して戻り値を無視します。
コードを少し単純化することもできます。開いたファイルをコンテキストマネージャとして使用して、自動的に閉じます。
with open("tmob_notcleaned.csv", "rb") as infile, open("tmob_cleaned.csv", "wb") as outfile:
reader = csv.reader(infile)
next(reader, None) # skip the headers
writer = csv.writer(outfile)
for row in reader:
# process each row
writer.writerow(row)
# no need to close, the files are closed automatically when you get to this point.
もし、ヘッダを未処理の出力ファイルに書きたければ、それも簡単です。next()
の出力をwriter.writerow()
に渡します。
headers = next(reader, None) # returns the headers or `None` if the input is empty
if headers:
writer.writerow(headers)
これを解決するもう1つの方法は、DictReaderクラスを使用することです。このクラスは、ヘッダー行を「スキップ」し、それを使用して名前付きインデックスを許可します。
次のように "foo.csv"を考えます。
FirstColumn,SecondColumn
asdf,1234
qwer,5678
次のようにDictReaderを使用してください。
import csv
with open('foo.csv') as f:
reader = csv.DictReader(f, delimiter=',')
for row in reader:
print(row['FirstColumn']) # Access by column header instead of column number
print(row['SecondColumn'])
row=1
を実行しても何も変更されません。ループの結果でそれを上書きするだけです。
1行スキップするにはnext(reader)
を実行します。