2015-06-24 2 views
6

Ich versuche, in einer Textdatei zu lesen, die etwa wie folgt aussieht:Python nicht ordnungsgemäß in Textdatei zu lesen

Date, StartTime, EndTime 
6/8/14, 1832, 1903 
6/8/14, 1912, 1918 
6/9/14, 1703, 1708 
6/9/14, 1713, 1750 

und das ist, was ich habe:

g = open('Observed_closure_info.txt', 'r') 
closure_date=[] 
closure_starttime=[] 
closure_endtime=[] 
file_data1 = g.readlines() 
for line in file_data1[1:]: 
    data1=line.split(', ') 
    closure_date.append(str(data1[0])) 
    closure_starttime.append(str(data1[1])) 
    closure_endtime.append(str(data1[2])) 

ich es tat so für eine vorherige Datei, die dieser sehr ähnlich war, und alles hat gut funktioniert. Diese Datei wird jedoch nicht korrekt eingelesen. Zuerst gibt es mir einen Fehler „Listenindex außerhalb des zulässigen Bereichs“ für closure_starttime.append(str(data1[1])) und wenn ich danach fragen zu drucken, was es für data1 oder closure_date hat, es gibt mir so etwas wie

['\x006\x00/\x008\x00/\x001\x004\x00,\x00 \x001\x008\x003\x002\x00,\x00 \x001\x009\x000\x003\x00\r\x00\n'] 

Ich habe versucht, den Text umzuschreiben Datei für den Fall, dass etwas an dieser Datei korrupt ist und es immer noch dasselbe tut. Ich bin mir nicht sicher warum, denn das letzte Mal hat das gut funktioniert.

Irgendwelche Vorschläge? Danke!

+0

Sehen Sie, was tut print (repr (g)) gibt Ihnen –

+0

Gibt es einen Raum vor jede Zeile? –

+0

Ich habe einige Formatierungen gemacht, aber einige Annahmen über die Kugeln getroffen ... Es gibt keine Bindestriche in der Datei, richtig? – Collin

Antwort

6

Dies sieht aus wie eine kommagetrennte Datei mit UTF-16-Codierung (daher \x00 Nullbytes). Sie verlassen nun die Eingabe von UTF-16, wie so dekodieren müssen:

import codecs 

closure_date=[] 
closure_starttime=[] 
closure_endtime=[] 
with codecs.open('Observed_closure_info.txt', 'r', 'utf-16-le') as g: 
    g.next() # skip header line 
    for line in g: 
     date, start, end = line.strip().split(', ') 
     closure_date.append(date) 
     closure_starttime.append(start) 
     closure_endtime.append(end) 
+0

Ja das hat funktioniert, danke! Tut mir leid, ich bin ein Amateur-Programmierer, das ist mir etwas fremd. Und dann, um die erste Zeile zu überspringen, die ein Header ist? –

+0

@Melinda: Deshalb hat er die Zeile 'g.next() # skip header line'. Es kann auch 'next (g)' geschrieben werden. –

1

versuchen, diese bei

g = open('Observed_closure_info.txt', 'r') 
closure_date=[] 
closure_starttime=[] 
closure_endtime=[] 
file_data1 = g.readlines() 
for line in file_data1[1:]: 
    data1=line.decode('utf-16').split(',') 
    closure_date.append(str(data1[0])) 
    closure_starttime.append(str(data1[1])) 
    closure_endtime.append(str(data1[2]))