2011-01-20 17 views
10

Ho un processo in cui un file CSV può essere scaricato, modificato e quindi caricato nuovamente. Sul download, il file CSV è nel formato corretto, senza alcun involucro virgoletteCSV Python: rimuovere le virgolette dal valore

1, someval, someval2 

quando apro il CSV in un foglio di calcolo, modificare e salvare, aggiunge virgolette doppie intorno alle corde

1, "someEditVal", "someval2" 

Ho immaginato che questa fosse solo l'azione del foglio di calcolo (in questo caso, openoffice). Voglio che il mio script di caricamento rimuova le doppie virgolette. Non riesco a rimuovere tutte le virgolette, solo nel caso in cui il corpo le contenga, e non voglio nemmeno controllare il primo e l'ultimo carattere per le virgolette.

Im quasi sicuro che la libreria CSV in pitone saprebbe come gestire questo, ma non è sicuro come usarlo ...

EDIT Quando uso i valori all'interno di un dizionario, risultano come segue

{'header':'"value"'} 

Grazie

+1

Le virgolette sono generalmente considerati per essere ammessi nei file CSV. Sei sicuro di doverli rimuovere? –

+0

Sì, li sto usando in uno script di elaborazione inserendoli in un dizionario, e risultano così {'header': '"value"'} – neolaser

+0

Open office calc 3.2 NON mette spazi dopo le virgole. Che versione stai usando? –

risposta

12

Per voi esempio, i seguenti lavori:

import csv 
writer = csv.writer(open("out.csv", "wb"), quoting=csv.QUOTE_NONE) 
reader = csv.reader(open("in.csv", "rb"), skipinitialspace=True) 
writer.writerows(reader) 

Potrebbe essere necessario giocare con le opzioni di dialetto del lettore e scrittore CSV - vedere lo documentation of the csv module.

+1

QUOTE_NONE funziona quando si scarica/crea il CSV, il che è fantastico! Ma il mio problema è quando modifico il csv (che è dove vengono aggiunte le doppie virgolette) e lo carica di nuovo. Grazie per l'utile risposta però! – neolaser

+0

Il codice che ho dato non è per analizzare il file - è per convertire il file "sbagliato" in uno "corretto". Se vuoi solo leggerlo, usa solo il lettore, non lo scrittore. Forse hai solo bisogno di 'skipinitialspace = True'? –

+2

QUOTE_NONE NON è una buona idea se l'OP dice che ha "" nel contenuto –

6

Grazie a tutti coloro che cercavano di aiutarmi, ma l'ho capito. Quando si specifica il lettore, è possibile definire il quotechar

csv.reader(upload_file, delimiter=',', quotechar='"') 

Questo gestisce le virgolette di avvolgimento delle stringhe.

+3

I due parametri che passi sono solo quelli predefiniti: puoi semplicemente ometterli! E questo non analizzerà i dati di esempio nella tua domanda - questo funzionerà solo con 'skipinitialspace = True'. –

+0

ah ok, grazie Sven! Ho omesso quei parametri e funziona ancora, grazie per l'aiuto. Ho usato il lettore usando i parametri predefiniti. Se desideri postare una risposta, segnala it – neolaser

+0

Se funziona, non hai inserito i dati reali nella tua domanda. Per quanto riguarda i dati nella domanda, questo non funziona. –

1

Per Python 3:

import csv 
writer = csv.writer(open("query_result.csv", "wt"), quoting=csv.QUOTE_NONE, escapechar='\\') 
reader = csv.reader(open("out.txt", "rt"), skipinitialspace=True) 
writer.writerows(reader) 

La risposta originale dà questo errore sotto Python 3. anche vedere questo SO per ingrandire: csv.Error: iterator should return strings, not bytes

Traceback (most recent call last): File "remove_quotes.py", line 11, in writer.writerows(reader) _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

+0

perché c'è ''rt''mode per' writer' e 'wt' per' reader'? Penso anche che dovresti impostare 'escapechar' – Zangetsu

+0

@Zangetsu Questa è una buona chiamata. Grazie per segnalarlo. Aggiornerò la risposta –

Problemi correlati