Ich verwende den unten angegebenen Code, um eine CSV mit Python zu bearbeiten. Im Code aufgerufene Funktionen bilden den oberen Teil des Codes.
Problem: Ich möchte, dass der unten angegebene Code die Bearbeitung der CSV aus der 2. Zeile startet. Ich möchte, dass die 1. Zeile, die Überschriften enthält, ausgeschlossen wird. Im Moment werden die Funktionen nur in der 1. Zeile angewendet und meine Kopfzeile wird geändert.
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()
Ich habe versucht, dieses Problem durch Initialisieren der row
Variablen auf zu lösen , 1
aber es hat nicht funktioniert.
Bitte helfen Sie mir bei der Lösung dieses Problems.
python
python-2.7
csv
Martijn Pieters
quelle
quelle
Antworten:
Ihre
reader
Variable ist iterierbar. Wenn Sie sie durchlaufen, rufen Sie die Zeilen ab.Um ein Element vor Ihrer Schleife zu überspringen, rufen Sie einfach
next(reader, None)
den Rückgabewert auf und ignorieren Sie ihn.Sie können Ihren Code auch ein wenig vereinfachen. Verwenden Sie die geöffneten Dateien als Kontextmanager, damit sie automatisch geschlossen werden:
Wenn Sie den Header unverarbeitet in die Ausgabedatei schreiben möchten, ist dies ebenfalls einfach. Übergeben Sie die Ausgabe von
next()
anwriter.writerow()
:quelle
for row in islice(reader, 1, None)
- wenn auch weniger explizit alsnext
für die meisten einfach für das Überspringen mehrere Kopfzeilen (oder immer nur bestimmte Stücke etc ...) ist es ganz praktisch Arbeitsplätze „ eine Zeile überspringen“try: writer.write(next(reader))... except StopIteration: # handle empty reader
try:
/ unterrichten zu müssenexcept:
.next
Iteration ist, dass sie "kostenlos" ist.islice
würde denreader
für immer hinzugefügten (zugegebenermaßen sehr geringen) Overhead zu jeder Iteration einschließen. Dasconsume
Rezept vonitertools
kann verwendet werden, um viele Werte schnell zu überspringen, ohne der nachfolgenden Verwendung eine Umhüllung hinzuzufügen, falls dieislice
ein astart
aber nein haben würdeend
, sodass der Overhead Ihnen nichts bringt.Eine andere Möglichkeit, dies zu lösen, besteht darin, die DictReader-Klasse zu verwenden, die die Kopfzeile "überspringt" und damit die benannte Indizierung zulässt.
Geben Sie "foo.csv" wie folgt an:
Verwenden Sie DictReader wie folgt:
quelle
If the fieldnames parameter is omitted, the values in the first row of the file f will be used as the fieldnames.
Siehe docs.python.org/2/library/csv.htmlWenn
row=1
Sie dies tun , ändert sich nichts, da Sie dies nur mit den Ergebnissen der Schleife überschreiben.Sie möchten
next(reader)
eine Zeile überspringen.quelle
for row in next(reader):
aber es gibt mirIndexError: string index out of range
Fehlernext(reader); for row in reader:
....