[Si prega di notare che questa è una domanda diversa da quella già risposto How to replace a column using Python’s built-in .csv writer module?]Scrivere con di Python modulo incorporato .csv
ho bisogno di fare una ricerca e sostituzione (specifico per una colonna di URL) in un enorme File .csv di Excel. Dato che sono nelle fasi iniziali del tentativo di insegnarmi un linguaggio di scripting, ho pensato di provare a implementare la soluzione in python.
Ho problemi quando cerco di scrivere di nuovo in un file .csv dopo aver effettuato una modifica il contenuto di una voce. Ho letto il official csv module documentation su come utilizzare lo scrittore, ma non c'è un esempio che riguardi questo caso. Nello specifico, sto cercando di ottenere le operazioni di lettura, sostituzione e scrittura eseguite in un ciclo. Tuttavia, non è possibile utilizzare lo stesso riferimento di "riga" in entrambi gli argomenti del ciclo for e come parametro per writer.writerow(). Quindi, una volta apportata la modifica al ciclo for, come dovrei scrivere di nuovo sul file?
edit: ho implementato i suggerimenti da S. Lott e Jimmy, ancora lo stesso risultato
Edit # 2: ho aggiunto il "rb" e "wb" al open() funzioni, per suggerimento di S. Lott
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)
edit: Per il vostro riferimento, questa è la nuova traceback completo dall'interprete:
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?)
OK, mi sono occupato anche di questo problema. Sembra che ci stiamo avvicinando ... Il traceback si è accorciato :) – ignorantslut
Ora che ci penso, però, prima che tentassi di riscrivere il file (cioè, mentre stavo ancora lavorando per trovare la colonna giusta in il .csv), lo script ha funzionato bene senza il rb. – ignorantslut
"I" rb "e" wb "sono assolutamente necessari.": Non in Python 3. Lì, dovresti chiamare open() con newline = ''. – Miles