2013-01-10 3 views
115

私はPythonを使用してcsvを編集するために下記のコードを使用しています。コード内で呼び出される関数は、コードの上部にあります。Pythonを使用してcsvファイルを編集するときにヘッダーをスキップ

問題:以下のコードで2行目のcsvの編集を開始したい、ヘッダーを含む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() 

私は1row変数を初期化することによって、この問題を解決しようとしたが、それはうまくいきませんでした。

この問題の解決にお役立てください。

+1

可能重複? ](http://stackoverflow.com/questions/11349333/when-processing-csv-data-how-do-i-ignore-the-first-line-of-data) – Louis

答えて

207

あなたの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. 

を使用すると、出力ファイルの未処理にヘッダを書きたい場合は、それはあまりにも簡単だ、writer.writerow()next()の出力を渡します:

headers = next(reader, None) # returns the headers or `None` if the input is empty 
if headers: 
    writer.writerow(headers) 
コンテキストマネージャは、それらが自動的に閉じているためにとして開かれたファイルを使用
+17

もう一つの方法はisliceの' for row eader、1、None) ' - 最も単純な"スキップ1行 "ジョブのための' next'よりも明示的ではありませんが、複数のヘッダー行をスキップする(または特定の塊などを取得する)ためにはとても便利です –

+0

'try:writer.write(next(reader))... StopIterationを除く:#空のリーダーを処理する' –

+0

@JonClements:おそらく。これは 'try:'/'except:'について教えなくても十分です。 –

3

Doing row=1は、ループの結果で上書きするだけなので、何も変更されません。

next(reader)を実行して1行をスキップします。

+0

私はそれを 'for rowに変更しようとしましたnext(reader): 'しかし、' IndexError:文字列インデックスが範囲外です 'エラー –

59

これを解決する別の方法は、DictReaderクラスを使用することです.DictReaderクラスは、ヘッダー行をスキップし、名前付きのインデックス付けを許可するために使用します。 "foo.csv" を考える

は、次のとおりです。このような

FirstColumn,SecondColumn 
asdf,1234 
qwer,5678 

使用DictReader:CSVデータを処理する場合、どのように私は、データの最初の行を無視します[の

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']) 
+11

質問が[XY問題](http://mywiki.wooledge.org/XyProblem)の例であるようなので、これが本当の答えであるように感じます。 – MariusSiuram

+1

DictReaderは確かに行く方法です。 –

+0

DictReaderを構築するときにフィールド名パラメータを省略した場合にのみこれが機能することに注意してください。ドキュメントごとに: 'fieldnamesパラメータを省略すると、ファイルfの最初の行の値がフィールド名として使用されます.' https://docs.python.org/2/library/csv.htmlを参照してください。 – BuvinJ

関連する問題