Korzystam z kodu, o którym mowa poniżej, do edycji pliku CSV za pomocą języka Python. Funkcje wywoływane w kodzie tworzą górną część kodu.
Problem: Chcę, aby poniższy kod zaczął edytować plik CSV z 2. rzędu. Chcę, aby wykluczył 1. wiersz zawierający nagłówki. Obecnie stosuje funkcje tylko w pierwszym rzędzie, a mój wiersz nagłówka ulega zmianie.
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 row
zmienną, 1
ale to nie działało.
Proszę o pomoc w rozwiązaniu tego problemu.
python
python-2.7
csv
Martijn Pieters
źródło
źródło
Odpowiedzi:
Twoja
reader
zmienna jest iterowalna, zapętlając ją, odzyskujesz wiersze.Aby pominąć jeden element przed pętlą, wystarczy wywołać
next(reader, None)
i zignorować zwracaną wartość.Możesz także nieco uprościć kod; użyj otwartych plików jako menedżerów kontekstu, aby automatycznie je zamknąć:
Jeśli chcesz zapisać nagłówek do nieprzetworzonego pliku wyjściowego, to również łatwe, przekaż dane wyjściowe
next()
dowriter.writerow()
:źródło
for row in islice(reader, 1, None)
- choć mniej wyraźne niż wnext
przypadku najprostszych zadań „pomiń jedną linię”, pomijanie wielu wierszy nagłówka (lub uzyskiwanie tylko niektórych fragmentów itp.) - jest to całkiem przydatnetry: writer.write(next(reader))... except StopIteration: # handle empty reader
try:
/except:
.next
iteracji jest to, że jest „darmowa”;islice
zawinąłobyreader
wieczność, dodając (co prawda bardzo niewielką ilość) narzut do każdej iteracji. Zconsume
przepisuitertools
można szybko ominąć wiele wartości, bez dodawania opakowania do późniejszego użycia, w przypadku, gdyislice
miałoby to wartość „start
ale”end
, ale „nie” , dzięki czemu narzut nic cię nie zyskuje.Innym sposobem rozwiązania tego problemu jest użycie klasy DictReader, która „pomija” wiersz nagłówka i używa go do dozwolonego indeksowania nazwanego.
Biorąc pod uwagę „foo.csv” w następujący sposób:
Użyj DictReader w następujący sposób:
źródło
If the fieldnames parameter is omitted, the values in the first row of the file f will be used as the fieldnames.
Patrz docs.python.org/2/library/csv.htmlRobienie
row=1
niczego nie zmieni, ponieważ po prostu nadpiszesz je wynikami pętli.Chcesz zrobić,
next(reader)
aby pominąć jeden wiersz.źródło
for row in next(reader):
ale powoduje toIndexError: string index out of range
błądnext(reader); for row in reader:
....