Pomiń nagłówki podczas edycji pliku csv za pomocą Pythona

Używam poniższego kodu do edycji pliku csv za pomocą Pythona. Funkcje wywołane w kodzie tworzą górną część kodu.

Problem: chcę, aby poniższy kod rozpoczął edycję pliku csv z 2. wiersza, chcę, aby wykluczyć 1. wiersz zawierający nagłówki. W tej chwili stosuje funkcje tylko w 1. wierszu, a mój wiersz nagłówka jest zmieniany.

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()

Próbowałem rozwiązać ten problem inicjując zmienną row na 1, ale to nie zadziałało.

Proszę pomóż mi w rozwiązaniu tego problemu.

Author: Martijn Pieters, 2013-01-10

3 answers

Twoja zmienna reader jest iterowalna, przez zapętlenie nad nią pobierasz wiersze.

Aby pominąć jeden element przed pętlą, po prostu zadzwoń next(reader, None) i zignoruj wartość zwracaną.

Możesz też nieco uprościć swój kod; użyj otwartych plików jako menedżerów kontekstu, aby je automatycznie zamknąć:

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.

Jeśli chcesz zapisać nagłówek do nieprzetworzonego pliku wyjściowego, to również jest to łatwe, przekaż wyjście next() do writer.writerow():

headers = next(reader, None)  # returns the headers or `None` if the input is empty
if headers:
    writer.writerow(headers)
 253
Author: Martijn Pieters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-18 06:10:31

Innym sposobem rozwiązania tego problemu jest użycie klasy DictReader, która "pomija" wiersz nagłówka i używa go do dozwolonego indeksowania nazw.

Given " foo.csv " jak następuje:

FirstColumn,SecondColumn
asdf,1234
qwer,5678

Użyj Dictreadera w ten sposób:

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'])
 78
Author: Chad Zawistowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-19 23:37:41

Robienie row=1 niczego nie zmieni, ponieważ po prostu nadpiszesz to wynikami pętli.

Chcesz zrobić next(reader) Aby pominąć jeden wiersz.

 3
Author: Katriel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-10 12:06:24