2013-07-10 13 views
11

Ho un file di testo, chiamiamolo goodlines.txt e voglio caricarlo e creare un elenco che contenga ogni riga nel file di testo.Python: AttributeError: l'oggetto '_io.TextIOWrapper' non ha attributo 'split'

Ho provato ad utilizzare la procedura split() in questo modo:

>>> f = open('goodlines.txt') 
>>> mylist = f.splitlines() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: '_io.TextIOWrapper' object has no attribute 'splitlines' 
>>> mylist = f.split() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: '_io.TextIOWrapper' object has no attribute 'split' 

Perché ottengo questi errori? Non è così che uso split()? (Sto usando python 3.3.2)

risposta

16

Si stanno utilizzando i metodi str su un oggetto file aperto.

È possibile leggere il file come un elenco di linee, semplicemente chiamando list() sul oggetto file:

with open('goodlines.txt') as f: 
    mylist = list(f) 

Questo fa includere i caratteri di nuova riga. È possibile togliere quelle di una lista di comprensione:

with open('goodlines.txt') as f: 
    mylist = [line.rstrip('\n') for line in f] 
4

Prova questo:

>>> f = open('goodlines.txt') 
>>> mylist = f.readlines() 

open() funzione restituisce un oggetto file. E per oggetto file, non esiste alcun metodo come splitlines() o split(). È possibile utilizzare dir(f) per visualizzare tutti i metodi dell'oggetto file.

+0

che va bene, ma io continuo a ricevere queste cose "\ n" alla fine di ogni ... Come faccio a rimuoverli senza cambiare il file di testo? –

2

Non stai leggendo il contenuto del file:

my_file_contents = f.read() 

Vedi the docs per ulteriori informazioni

Si potrebbe, senza chiamare read() o readlines() ciclo sopra il vostro oggetto file:

f = open('goodlines.txt') 
for line in f: 
    print(line) 

Se si desidera un elenco fuori di esso (senza \n come richiesto)

my_list = [line.rstrip('\n') for line in f] 
+2

La comprensione dell'elenco ** non ** elimina le nuove righe. Potresti anche chiamare semplicemente 'list (f)' allo stesso effetto del tuo codice corrente. –

+0

@ samuele-mattiuzzo "my_list = [riga per riga in f]" ANCHE fatto una lista con \ n alla fine di ciascuna, anche se non è nel file di testo. Ma dovrebbe dividere il lavoro quando viene letto? –

+0

Come il signor Pieters ha prontamente sottolineato, il '\ n' deve essere striato comunque. –

Problemi correlati