2016-03-06 15 views
5

Esiste un modo per analizzare una stringa delimitata da una singola virgola senza utilizzare nulla di simile a csv.reader (..)? Posso usare la funzione split(',') ma ciò non funziona quando un valore di colonna valido contiene una virgola stessa. La libreria csv ha lettori per l'analisi di file CSV che gestiscono correttamente il caso speciale sopra menzionato, ma non posso usarli perché ho bisogno di analizzare solo una singola stringa. Tuttavia se il CSV di Python consente di analizzare una singola stringa stessa, allora questa è una novità per me.Analizza una singola stringa CSV?

risposta

11

Date un'occhiata più da vicino la documentazione del modulo csv, che dice:

reader(...) 
    csv_reader = reader(iterable [, dialect='excel'] 
          [optional keyword args]) 
     for row in csv_reader: 
      process(row) 

    The "iterable" argument can be any object that returns a line 
    of input for each iteration, such as a file object or a list. The 
    optional "dialect" parameter is discussed below. The function 
    also accepts optional keyword arguments which override settings 
    provided by the dialect. 

Quindi, se si avere una stringa:

>>> s = '"this is", "a test", "of the csv", "parser"' 

E si desidera "un oggetto che restituisce una linea di Ingresso per ogni iterazione", si può semplicemente avvolgere la stringa in un elenco:

>>> r = csv.reader([s]) 
>>> list(r) 
[['this is', 'a test', 'of the csv parser']] 

Ed è così che si analizza una stringa con il modulo csv.

+0

Immagino che sarebbe più elegante da usare 'iter (s)' come a un iteratore generale invece di '[s]' (specificando una lista). Ma tu hai il mio +1 – RafaelC

+0

Questo probabilmente non funzionerà se la stringa ha quotato linefeed all'interno dei valori; @ la risposta di alecxe ha più senso – swooby

9

È ancora possibile analizzare una singola stringa con csv. Utilizzare StringIO di scrivere una stringa buffer (noto anche come file di memoria):

import csv 
from StringIO import StringIO 

s = "your string" 
buff = StringIO(s) 

reader = csv.reader(buff) 
for line in reader: 
    print(line) 
+0

Per Python 3 usare 'da io import StringIO' vedere [qui] (https://docs.python.org/3/library/io.html#text-io) –

Problemi correlati