2012-04-21 37 views
38

mam problem, aby zrozumieć, powtarzanie pliku: Oto idę na co mam wpisać na tłumacza, a wynik:powtarzanie pliku przy użyciu Pythona

>>> f = open('baby1990.html', 'rU') 
>>> for line in f.readlines(): 
>>> print(line) 

>>> ... 
>>> ... all the lines from the file appear here 
>>> ... 

Kiedy próbuję iteracyjne na tym samym otwarte plik ponownie mam nic !!!!

>>> f = open('baby1990.html', 'rU') 
>>> for line in f.readlines(): 
>>> print(line) 
>>> 
>>> 

Nie ma wyjścia, aby rozwiązać ten problem, muszę zamknąć() plik, a następnie otwórz go ponownie do czytania! Czy to normalne zachowanie?

Odpowiedz

61

Tak, to jest normalne zachowanie. Zasadniczo najpierw czytasz koniec pliku (możesz go sobie wyobrazić jako czytanie taśmy), więc nie możesz już z niego czytać, dopóki go nie zresetujesz, albo używając f.seek(0), aby zmienić pozycję na początek plik lub zamknij go, a następnie otwórz ponownie, co rozpocznie się od początku pliku.

Jeśli wolisz, możesz użyć składni with, która automatycznie zamknie plik.

np

with open('baby1990.html', 'rU') as f: 
    for line in f: 
    print line 

raz ten blok zakończeniu wykonywania, plik zostanie automatycznie zamknięte dla ciebie, więc można wykonać tego bloku wielokrotnie bez wyraźnego zamykania pliku siebie i odczytać plik w ten sposób kółko.

+0

pO chce pomóc zrozumieć, co się dzieje, gdy obiekt pliku jest zużyty. –

+0

Właśnie dodałem tę część wyjaśnienia – Levon

+1

Nie ma powodu, aby czytać plik dwukrotnie, jeśli używasz 'readlines()'. –

1

Oczywiście. To jest normalne i rozsądne zachowanie. Zamiast zamykać i ponownie otwierać, można uzyskać plik rewind.

+0

to nie jest pomocne dla użytkownika, który jest zaznajomiony z pojęciem odczytu wskaźnika – scubbo

8

Obiekt pliku to bufor . Gdy czytasz z bufora, część, którą czytasz, jest zużywana (pozycja odczytu jest przesunięta do przodu). Kiedy czytasz cały plik, pozycja odczytu znajduje się w EOF, więc nic nie zwraca, ponieważ nic nie pozostaje do odczytania.

Jeśli trzeba, z jakiegoś powodu, zresetować pozycję przeczytać na obiekcie plików, można zrobić:

f.seek(0) 
13

jako przedmiot plik odczytuje plik, wykorzystuje wskaźnik śledzić gdzie to jest. Jeśli czytasz część pliku, a następnie wróć do niego później, pojawi się w miejscu, w którym skończyłeś. Jeśli przeczytasz cały plik i wrócisz do tego samego obiektu pliku, będzie to wyglądało jak odczytanie pustego pliku, ponieważ wskaźnik znajduje się na końcu pliku i nie pozostało nic do czytania. Możesz użyć file.tell(), aby zobaczyć, gdzie w pliku znajduje się wskaźnik i file.seek, aby ustawić wskaźnik. Na przykład:

>>> file = open('myfile.txt') 
>>> file.tell() 
0 
>>> file.readline() 
'one\n' 
>>> file.tell() 
4L 
>>> file.readline() 
'2\n' 
>>> file.tell() 
6L 
>>> file.seek(4) 
>>> file.readline() 
'2\n' 

Ponadto, należy wiedzieć, że file.readlines() odczytuje cały plik i zapisuje go jako listy.To warto wiedzieć, bo można wymienić:

for line in file.readlines(): 
    #do stuff 
file.seek(0) 
for line in file.readlines(): 
    #do more stuff 

z:

lines = file.readlines() 
for each_line in lines: 
    #do stuff 
for each_line in lines: 
    #do more stuff 

Można również iteracyjne nad plik, jedna linia na raz, bez trzymania całego pliku w pamięci (może to być bardzo przydatne dla bardzo dużych plików), wykonując:

for line in file: 
    #do stuff 
Powiązane problemy