2013-02-21 3 views
5

Ho fatto qualche ricerca ma la maggior parte delle risposte riguarda la lettura di un file csv completo e nessuno di questi è come il problema che sto affrontando.Python - come leggere/analizzare la riga simile a csv?

Sto cercando di leggere un file dalla rete utilizzando urllib2:

request = urllib2.Request('http://.../tv.txt') 
response = urllib2.urlopen(request) 
lines = response.readlines() 
for line in lines: 
    ... 

Il formato "linea" si presenta come questi:

"ABC", "XYZ,MNO", "KLM" 
"ABC", "MN" 
"ABC", "123", "10", "OPPA GANGNAM STYLE", "LADY" 

Come visto in precedenza, queste righe non sono in realtà CSV Linee. Il numero di colonne continua a cambiare.

C'è un modo per dividere ogni riga in un elenco? Il risultato dovrebbe essere il desiderio:

["ABC", "XYZ,MNO", "KLM"] 
["ABC", "MN"] 
["ABC", "123", "10", "OPPA GANGNAM STYLE", "LADY"] 

Ho provato con line.split (""), ma non riesco a dividere correttamente perché è presente una virgola all'interno di ogni coppia di doppi apici.

Per favore aiutatemi se sapete come. Grazie mille.

Cheers,

PHP-Python-Java-MySQL-newbie.

risposta

8

usa il modulo csv, fa quello che ti serve.

yourstring= '"ABC", "XYZ,MNO", "KLM"\n"ABC", "MN"\n"ABC", "123", "10", "OPPA GANGNAM STYLE", "LADY"' 

import csv 
import StringIO 

class MyDialect(csv.Dialect): 
    strict = True 
    skipinitialspace = True 
    quoting = csv.QUOTE_ALL 
    delimiter = ',' 
    quotechar = '"' 
    lineterminator = '\n' 


b=StringIO.StringIO(yourstring) 
r=csv.reader(b,MyDialect()) 

for i in r: 
    print len(i), ':',' @ '.join(i) 
+1

Come menzionato nella domanda, ho provato il modulo csv. Se puoi indicarmi quale funzione nel modulo csv, sarebbe fantastico. Ho cercato per riga in csv.reader ([line]): fila stampa per questo http://docs.python.org/2/library/csv.html#examples ma senza successo – markbse

+0

Sono stato chiaro abbastanza ora? – LtWorf

+0

Grazie. Durante l'attesa, ho cambiato l'origine da CSV a JSON, quindi non ho testato il tuo script, ma lo contrassegnerò come risposta. – markbse