Saya menggunakan kode rujukan di bawah ini untuk mengedit csv menggunakan Python. Fungsi yang dipanggil dalam bentuk kode bagian atas kode.
Masalah: Saya ingin kode yang dirujuk di bawah ini mulai mengedit csv dari baris ke-2, saya ingin mengecualikan baris ke-1 yang berisi header. Saat ini sedang menerapkan fungsi pada baris ke-1 saja dan baris header saya semakin berubah.
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()
Saya mencoba untuk memecahkan masalah ini dengan menginisialisasi row
variabel 1
tetapi tidak berhasil.
Tolong bantu saya dalam memecahkan masalah ini.
python
python-2.7
csv
Martijn Pieters
sumber
sumber
Jawaban:
reader
Variabel Anda adalah iterable, dengan mengulanginya Anda mengambil baris.Untuk membuatnya melewatkan satu item sebelum loop Anda, cukup panggil
next(reader, None)
dan abaikan nilai kembali.Anda juga dapat menyederhanakan kode Anda sedikit; gunakan file yang dibuka sebagai manajer konteks agar ditutup secara otomatis:
Jika Anda ingin menulis header ke file output yang belum diproses, itu mudah juga, meneruskan output
next()
kewriter.writerow()
:sumber
for row in islice(reader, 1, None)
- walaupun kurang eksplisit daripadanext
untuk pekerjaan "lewati satu baris" yang paling sederhana, untuk melewatkan beberapa baris tajuk (atau hanya mendapatkan potongan tertentu dll ...) itu cukup bergunatry: writer.write(next(reader))... except StopIteration: # handle empty reader
try:
/except:
.next
iterasi eksplisit adalah "gratis";islice
akan membungkusreader
selamanya menambahkan (jumlah yang diakui sangat kecil) overhead untuk setiap iterasi. Theconsume
resep dariitertools
dapat digunakan untuk melewatkan banyak nilai dengan cepat, tanpa menambahkan pembungkus untuk penggunaan berikutnya, dalam kasus di manaislice
akan memilikistart
tapi tidak adaend
, sehingga biaya overhead tidak mendapatkan apa-apa.Cara lain untuk menyelesaikan ini adalah dengan menggunakan kelas DictReader, yang "melompati" baris header dan menggunakannya untuk diizinkan bernama pengindeksan.
Diberikan "foo.csv" sebagai berikut:
Gunakan DictReader seperti ini:
sumber
If the fieldnames parameter is omitted, the values in the first row of the file f will be used as the fieldnames.
Lihat docs.python.org/2/library/csv.htmlMelakukan
row=1
tidak akan mengubah apa pun, karena Anda hanya akan menimpanya dengan hasil loop.Anda ingin melakukannya
next(reader)
untuk melewati satu baris.sumber
for row in next(reader):
tetapi memberi sayaIndexError: string index out of range
kesalahannext(reader); for row in reader:
....