265

以下のコードを使用して、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たが、機能しませんでした。

この問題を解決するのを手伝ってください。

4

5 に答える 5

452

変数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)
于 2013-01-10T12:07:53.553 に答える
146

これを解決する別の方法は、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'])
于 2015-03-19T23:37:41.427 に答える
10

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

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

于 2013-01-10T12:06:24.597 に答える
2

next()で1回繰り返すだけです

with open(filename) as file:

    csvreaded = csv.reader(file)
    header = next(csvreaded)

    for row in csvreaded:
        empty_list.append(row) #your csv list without header  

または、リーダーオブジェクトの最後に[1:]を使用します

with open(filename) as file:

    csvreaded = csv.reader(file)
    header = next(csvreaded)

    for row in csvreaded[1:]:
        empty_list.append(row) #your csv list without header  
于 2021-08-26T16:00:13.197 に答える
0

MartijnPietersの反応に触発されました。

ファイルからヘッダーを削除するだけでよいcsv場合は、標準のPythonファイルI / Oライブラリを使用して記述し、CSV Pythonライブラリを使用して記述しないと、より効率的に作業できます。

with open("tmob_notcleaned.csv", "rb") as infile, open("tmob_cleaned.csv", "wb") as outfile:
   next(infile)  # skip the headers
   outfile.write(infile.read())
于 2020-10-30T18:18:43.683 に答える