2015-06-24 23 views
6

Próbuję odczytać w pliku tekstowym, który wygląda mniej więcej tak:pyton nie czyta poprawnie w pliku tekstowym

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

i to, co mam:

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])) 

to zrobiłem w ten sposób poprzedni plik, który był bardzo podobny do tego, i wszystko działało dobrze. Jednak ten plik nie jest poprawnie odczytywany. Po pierwsze daje mi błąd „Index Lista poza zasięgiem” dla closure_starttime.append(str(data1[1])) a kiedy prosić o to, aby wydrukować to, co ma do danych1 lub closure_date, że daje mi coś takiego

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

Próbowałem przepisywanie tekstu plik na wypadek, gdyby coś było uszkodzone w tym konkretnym pliku i nadal robi to samo. Nie jestem pewien dlaczego, ponieważ ostatnio to działało.

Wszelkie sugestie? Dzięki!

+0

patrzeć na to co robi print (repr (g)) daje –

+0

Czy istnieje przestrzeń przed każda linia? –

+0

Zrobiłem pewne poprawki formatowania, ale założyłem pewne założenia na temat pocisków ... w rzeczywistym pliku nie ma żadnych kresek, prawda? – Collin

Odpowiedz

6

Wygląda na to, że plik jest oddzielany przecinkami z kodowaniem UTF-16 (stąd też bajty zerowe \x00). Trzeba będzie dekodować sygnał z UTF-16, tak jak poniżej:

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

Tak, zadziałało, dziękuję! Przepraszam, jestem programistą amatorskim, więc jest mi trochę obco. A następnie, aby pominąć pierwszą linię, która jest nagłówkiem? –

+0

@Melinda: Właśnie dlatego ma linię 'g.next() # przeskok linii nagłówka'. Można go również zapisać jako "next (g)". –

1

spróbować tej

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]))