Domanda

[Si noti che questa è una domanda diversa dalla già risposta Come sostituire una colonna usando il modulo di scrittura .csv incorporato di Python? ]

Devo fare una ricerca e sostituzione (specifica di una colonna di URL) in un enorme file .csv di Excel. Dato che sono nelle prime fasi del tentativo di insegnarmi un linguaggio di scripting, ho pensato di provare a implementare la soluzione in Python.

Sto riscontrando problemi quando provo a riscrivere in un file .csv dopo aver apportato una modifica al contenuto di una voce. Ho letto la documentazione ufficiale del modulo CSV sull'uso dello scrittore, ma non c'è un esempio che copra questo caso. In particolare, sto cercando di ottenere le operazioni di lettura, sostituzione e scrittura eseguite in un ciclo. Tuttavia, non è possibile utilizzare lo stesso riferimento 'riga' sia nell'argomento del ciclo for sia come parametro per writer.writerow (). Quindi, una volta effettuata la modifica nel ciclo for, come devo riscrivere il file?

modifica: ho implementato i suggerimenti di S. Lott e Jimmy, sempre con lo stesso risultato

modifica n. 2: ho aggiunto il " rb " e " wb " alle funzioni open (), secondo il 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)

modifica: per riferimento, questo è il nuovo traceback completo dell'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?)
È stato utile?

Soluzione

Non puoi leggere e scrivere lo stesso file.

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

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

L'approccio normale a TUTTA la manipolazione dei file è quello di creare una COPIA modificata del file originale. Non tentare di aggiornare i file in atto. È solo un cattivo piano.


Modifica

Nelle linee

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

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

Il " rb " e " wb " sono assolutamente richiesti. Ogni volta che li ignori, apri il file per la lettura nel formato sbagliato.

Devi utilizzare " rb " per leggere un file .CSV. Non c'è scelta con Python 2.x. Con Python 3.x, puoi ometterlo, ma usa " r " esplicitamente per chiarire.

Devi utilizzare " wb " per scrivere un file .CSV. Non c'è scelta con Python 2.x. Con Python 3.x, devi utilizzare " w " ;.


Modifica

Sembra che tu stia usando Python3. Dovrai rilasciare il messaggio " b " da " rb " e " wb " ;.

Leggi questo: http://docs.python.org/3.0/ biblioteca / functions.html # aperto

Altri suggerimenti

L'apertura di file CSV come binario è semplicemente sbagliata. I CSV sono normali file di testo, quindi è necessario aprirli con

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

L'errore

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

arriva perché li stai aprendo in modalità binaria.

Quando stavo aprendo Excel CSV con Python, ho usato qualcosa del tipo:

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

e ha funzionato piuttosto velocemente (ne stavo aprendo due di circa 10 MB per file csv, anche se l'ho fatto con python 2.6, non con la versione 3.0).

Esistono pochi moduli funzionanti per lavorare con i file csv di Excel all'interno di Python. pyExcelerator è uno dei loro.

il problema è che stai provando a scrivere nello stesso file da cui stai leggendo. scrivere in un altro file e quindi rinominarlo dopo aver eliminato l'originale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top