2015-06-24 12 views
6

Sto cercando di leggere in un file di testo che sembra qualcosa di simile:python non adeguatamente leggendo in file di testo

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

e questo è quello che ho:

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

l'ho fatto in questo modo per un file precedente che era molto simile a questo, e tutto ha funzionato bene. Tuttavia, questo file non viene letto correttamente. In primo luogo mi dà un errore "indice di lista fuori portata" per closure_starttime.append(str(data1[1])) e quando chiedo per stampare ciò che ha per data1 o closure_date, mi dà qualcosa come

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

Ho provato riscrivere il testo file nel caso in cui ci fosse qualcosa di corrotto su quel particolare file, e fa sempre la stessa cosa. Non sono sicuro del perché, l'ultima volta, questo ha funzionato bene.

Qualche suggerimento? Grazie!

+0

Guardate che cosa fa di stampa (repr (g)) ti dà –

+0

C'è uno spazio prima ogni linea? –

+0

Ho fatto qualche aggiustamento della formattazione, ma ho fatto alcune supposizioni sui proiettili .. non ci sono trattini nel vero file, giusto? – Collin

risposta

6

Sembra un file separato da virgole con codifica UTF-16 (da cui i byte null \x00). Dovrete decodificare l'input da UTF-16, in questo modo:

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

Sì, questo ha funzionato, grazie! Scusate, sono un programmatore dilettante quindi è un po 'strano per me. E poi saltare la prima riga che è un'intestazione? –

+0

@Melinda: Ecco perché ha la riga 'g.next() # salta riga d'intestazione'. Può anche essere scritto 'next (g)'. –

1

provare questo

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