2013-02-21 10 views
5

Ich habe eine Suche durchgeführt, aber die meisten Antworten beziehen sich auf das Lesen einer kompletten CSV-Datei und keines davon ist wie das Problem, das ich vor mir habe.Python - wie CSV lesen/analysieren wie Linie?

Ich versuche, eine Datei aus Netz mit urllib2 zu lesen:

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

Die "Linie" Format wie diese aussieht:

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

Wie oben gesehen, diese Zeilen sind nicht wirklich CSV Linien. Die Anzahl der Spalten ändert sich ständig.

Gibt es eine Möglichkeit, jede Zeile in eine Liste aufzuteilen? Der Wunsch Ergebnis sollte sein:

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

Ich habe versucht, line.split mit („“), aber es kann nicht richtig aufgeteilt, weil es innerhalb jedes Paar doppelte Anführungszeichen Komma ist.

Bitte helfen Sie mir, wenn Sie wissen, wie. Vielen Dank.

Cheers,

PHP-Python-Java-MySQL-Neuling.

Antwort

8

Verwenden Sie das CSV-Modul, es tut was Sie brauchen.

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

Wie in der Frage erwähnt, habe ich versucht, CSV-Modul. Wenn Sie mir zeigen können, welche Funktion in CSV-Modul, das wäre toll. Ich habe für Zeile in csv.reader versucht ([line]): Druck Reihe pro dieses http://docs.python.org/2/library/csv.html#examples aber kein Erfolg – markbse

+0

Ist das klar genug jetzt? – LtWorf

+0

Danke. Während ich gewartet habe, habe ich die Quelle vom CSV- in das JSON-Format geändert, also habe ich dein Skript nicht getestet, sondern dies als Antwort markiert. – markbse