2011-11-21 28 views

risposta

1

Si dovrebbe utilizzare la libreria Python csv: http://docs.python.org/library/csv.html

+1

Tale nesso non è sufficiente a risolvere il problema. Immediatamente, un lettore CSV non analizzerà correttamente la stringa di test dell'OP. –

6

È possibile utilizzare the csv module dalla libreria standard:

>>> import csv 
>>> testdata = ['48, "one, two", "2011/11/03"'] 
>>> testcsv = csv.reader(testdata,skipinitialspace=True) 
>>> testcsv.next() 
['48', 'one, two', '2011/11/03'] 

L'unica cosa a cui fare attenzione è che le csv.reader oggetti si aspettano un iterator che sarà restituisce una stringa ogni volta che viene chiamato next(). Ciò significa che non è possibile passare una stringa di stringa direttamente a reader(), ma è possibile includerla in un elenco come sopra.

Dovrai stare attento con il formato dei tuoi dati o dire a csv come gestirlo. Per impostazione predefinita, le virgolette devono venire immediatamente dopo la virgola o il modulo csv interpreterà il campo come iniziando con uno spazio anziché essere quotato. È possibile risolvere questo problema utilizzando the skipinitialspace option.

+0

Questo non risolve il problema dell'OP. "uno, due" non dovrebbe essere diviso, perché la virgola è tra virgolette o interpreto male qualcosa? Ho provato questo qui per conto mio e ho ottenuto lo stesso risultato di te, leggendo il doc [csv] (http://docs.python.org/library/csv.html#dialects-and-formatting-parameters), ho capito che per impostazione predefinita dovrebbe calpestare tutto tra virgolette come un campo, per impostazione predefinita. – stema

+0

@Dave webb: Djmac vuole '" uno, due "' in una singola variabile che non è il caso nella tua risposta ... richiede output come '['48', '" one, two "' ''" 2011/11/03 "']', lunghezza = 3 nel tuo caso lunghezza = 4 – avasal

+0

@stema - Buon punto! Non ho letto abbastanza attentamente l'output del mio codice. Risulta che il problema è con i dati di esempio.Se un campo inizia con uno spazio, allora 'csv' assume che anche il campo lo faccia e' '' è parte del campo, cioè 'csv' non taglia automaticamente ogni valore.Ho risolto i dati di esempio e il codice ora funziona Grazie per il punto 1. –

3

È possibile utilizzare il modulo shlex per analizzare la stringa.

Per impostazione predefinita, shlex.split sarà dividere la stringa in caratteri spazi bianchi non racchiusi tra virgolette:

>>> shlex.split(teststring) 
['48,', 'one, two,', '2011/11/03'] 

Questo non rimuove le virgole finali da stringa, ma è vicino a quello che vi serve. Tuttavia, se si personalizza il parser di considerare la virgola come un carattere di spazio, allora si otterrà l'output di cui avete bisogno:

>>> parser = shlex.shlex(teststring) 
>>> parser.whitespace 
' \t\r\n' 
>>> parser.whitespace += ',' 
>>> list(parser) 
['48', '"one, two"', '"2011/11/03"'] 

Nota: l'oggetto parser viene utilizzato come un iteratore per ottenere i gettoni uno per uno. Quindi, list(parser) itera sopra l'oggetto parser e restituisce la stringa suddivisa dove necessario.

+0

Questo ha fatto il lavoro, ma isn ' t buono di af è come il modulo CSV. –

23

Il csv module funzionerà se si impostano le opzioni per gestire questo dialetto:

>>> import csv 
>>> teststring = '48, "one, two", "2011/11/03"' 
>>> for line in csv.reader([teststring], skipinitialspace=True): 
    print line 


['48', 'one, two', '2011/11/03'] 
+3

+1: bella cattura, per questo 'skipinitialspace'! Ho cercato di capire la documentazione di 'csv', ma non ho potuto far funzionare l'input OP :) –

-1
import shlex 
teststring = '48, "one, two", "2011/11/03"' 
output = shlex.split(teststring) 
output = [re.sub(r",$","",w) for w in output] 
print output 
['48', 'one, two', '2011/11/03'] 
Problemi correlati