Frage

[Bitte beachten Sie, dass dies eine andere Frage als die bereits beantwortete ist Wie ersetze ich eine Spalte mit dem in Python integrierten CSV-Writer-Modul?]

Ich muss eine Suche und Ersetzung (spezifisch für eine URL-Spalte) in einer großen Excel-CSV-Datei durchführen.Da ich gerade dabei bin, mir selbst eine Skriptsprache beizubringen, dachte ich, ich würde versuchen, die Lösung in Python zu implementieren.

Ich habe Probleme, wenn ich versuche, in eine CSV-Datei zurückzuschreiben, nachdem ich eine Änderung am Inhalt eines Eintrags vorgenommen habe.Ich habe das gelesen Offizielle Dokumentation zum CSV-Modul über die Verwendung des Writers, aber es gibt kein Beispiel, das diesen Fall abdeckt.Insbesondere versuche ich, die Lese-, Ersetzungs- und Schreibvorgänge in einer Schleife auszuführen.Allerdings kann man nicht dieselbe „Zeilen“-Referenz sowohl im Argument der for-Schleife als auch als Parameter für write.writerow() verwenden.Wie soll ich also in die Datei zurückschreiben, nachdem ich die Änderung in der for-Schleife vorgenommen habe?

bearbeiten: Ich habe die Vorschläge von S. umgesetzt.Lott und Jimmy, immer noch das gleiche Ergebnis

Bearbeiten Nr. 2: Ich habe „rb“ und „wb“ gemäß S zu den open()-Funktionen hinzugefügt.Lotts Vorschlag

import csv

#filename = 'C:/Documents and Settings/username/My Documents/PALTemplateData.xls'

csvfile = open("PALTemplateData.csv","rb")
csvout = open("PALTemplateDataOUT.csv","wb")
reader = csv.reader(csvfile)
writer = csv.writer(csvout)

changed = 0;

for row in reader:
    row[-1] = row[-1].replace('/?', '?')
    writer.writerow(row)                  #this is the line that's causing issues
    changed=changed+1

print('Total URLs changed:', changed)

bearbeiten: Zu Ihrer Information: Dies ist die neu Vollständiger Traceback vom Interpreter:

Traceback (most recent call last):
  File "C:\Documents and Settings\g41092\My Documents\palScript.py", line 13, in <module>
    for row in reader:
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
War es hilfreich?

Lösung

Sie können nicht dieselbe Datei lesen und schreiben.

source = open("PALTemplateData.csv","rb")
reader = csv.reader(source , dialect)

target = open("AnotherFile.csv","wb")
writer = csv.writer(target , dialect)

Der normale Ansatz bei ALLEN Dateimanipulationen besteht darin, eine modifizierte KOPIE der Originaldatei zu erstellen.Versuchen Sie nicht, Dateien an Ort und Stelle zu aktualisieren.Es ist einfach ein schlechter Plan.


Bearbeiten

In den Zeilen

source = open("PALTemplateData.csv","rb")

target = open("AnotherFile.csv","wb")

Die Angaben „rb“ und „wb“ sind unbedingt erforderlich.Jedes Mal, wenn Sie diese ignorieren, öffnen Sie die Datei zum Lesen im falschen Format.

Sie müssen „rb“ verwenden, um eine .CSV-Datei zu lesen.Bei Python 2.x gibt es keine Wahl.Mit Python 3.x können Sie dies weglassen, aber zur Verdeutlichung explizit „r“ verwenden.

Sie müssen „wb“ verwenden, um eine .CSV-Datei zu schreiben.Bei Python 2.x gibt es keine Wahl.Bei Python 3.x müssen Sie „w“ verwenden.


Bearbeiten

Es scheint, dass Sie Python3 verwenden.Sie müssen das „b“ aus „rb“ und „wb“ entfernen.

Lesen Sie dies: http://docs.python.org/3.0/library/functions.html#open

Andere Tipps

Das Öffnen von CSV-Dateien als Binärdatei ist einfach falsch.CSV sind normale Textdateien, daher müssen Sie sie mit öffnen

source = open("PALTemplateData.csv","r")
target = open("AnotherFile.csv","w")

Der Fehler

_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

kommt, weil Sie sie im Binärmodus öffnen.

Als ich Excel-CSVs mit Python öffnete, verwendete ich so etwas wie:

try:    # checking if file exists
    f = csv.reader(open(filepath, "r", encoding="cp1250"), delimiter=";", quotechar='"')
except IOError:
    f = []

for record in f:
    # do something with record

und es funktionierte ziemlich schnell (ich habe zwei CSV-Dateien mit jeweils etwa 10 MB geöffnet, obwohl ich dies mit Python 2.6 und nicht mit der Version 3.0 gemacht habe).

Es gibt nur wenige Arbeitsmodule für die Arbeit mit Excel-CSV-Dateien in Python – pyExcelerator Ist einer von ihnen.

Das Problem besteht darin, dass Sie versuchen, in dieselbe Datei zu schreiben, aus der Sie lesen.Schreiben Sie in eine andere Datei und benennen Sie sie um, nachdem Sie das Original gelöscht haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top