Python: AttributeError: Obiectul ‘_io.TextIOWrapper’ nu are atributul ‘split’ (Programare, Python, Python 3.X)

Kaizer von Maanen a intrebat.

Am un fișier text, să îl numim goodlines.txt și vreau să îl încarc și să fac o listă care să conțină fiecare linie din fișierul text.

Am încercat să folosesc split() procedura în felul următor:

>>> 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'

De ce primesc aceste erori? Nu așa trebuie să folosesc split()? ( Eu folosesc python 3.3.2)

3 răspunsuri
Martijn Pieters

Folosiți str metode pe un obiect de fișier deschis.

Puteți citi fișierul ca o listă de linii prin simpla apelare a lui list() pe obiectul fișier:

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

Acest lucru face include caracterele de linie nouă. Le puteți elimina pe acestea într-o înțelegere a listei:

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

Sheng

Încearcă asta:

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

open() funcția returnează un obiect fișier. Iar pentru obiectul fișier, nu există o metodă precum splitlines() sau split(). Ați putea folosi dir(f) pentru a vedea toate metodele obiectului fișier.

Comentarii

  • Este în regulă, dar continui să primesc aceste „
    ” la sfârșitul fiecărei… Cum le pot elimina fără a modifica fișierul text? –  > Por Kaizer von Maanen.
Samuele Mattiuzzo

Nu citiți conținutul fișierului:

my_file_contents = f.read()

Vezi documentația pentru informații suplimentare

Ați putea, fără a apela read() sau readlines() să faceți o buclă peste obiectul fișier:

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

Dacă doriți să obțineți o listă din acesta (fără
așa cum ați cerut)

my_list = [line.rstrip('
') for line in f]

Comentarii

  • Înțelegerea listei face nu elimină liniile noi. Puteți la fel de bine să apelați pur și simplu list(f) în schimb, pentru a obține același efect ca și codul actual. –  > Por Martijn Pieters.
  • @samuele-mattiuzzo „my_list = [line for line for line in f]” A FĂCUT ȘI o listă cu
    la sfârșitul fiecăruia, chiar dacă nu se află în fișierul text. Dar ar trebui ca split să funcționeze atunci când este citit? –  > Por Kaizer von Maanen.
  • După cum a subliniat prompt dl Pieters, aplicația
    trebuie oricum să fie eliminat. –  > Por Samuele Mattiuzzo.