Zapętl plik, aby odczytać linie:
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
Obiekty plików są iterowalne i dają linie do EOF. Użycie obiektu pliku jako elementu iteracyjnego wykorzystuje bufor, aby zapewnić wydajne odczyty.
Możesz zrobić to samo ze stdin (nie musisz używać raw_input()
:
import sys
for line in sys.stdin:
do_something()
Aby uzupełnić obraz, odczyty binarne można wykonać za pomocą:
from functools import partial
with open('somefile', 'rb') as openfileobject:
for chunk in iter(partial(openfileobject.read, 1024), b''):
do_something()
gdzie chunk
będzie zawierał do 1024 bajtów naraz z pliku, a iteracja zostanie zatrzymana, gdy openfileobject.read(1024)
zacznie zwracać puste ciągi bajtów.
line
końcu pojawi się znak nowej linii.stdin
uruchomionego procesu ... więc nigdy nie ma EOF, dopóki nie zabiję procesu. Ale potem dochodzę do „końca do teraz” i wpadam w impas. Jak to wykryć, a nie zakleszczenie? Na przykład, jeśli nie ma nowych linii, przestań czytać pliki (nawet jeśli nie ma EOF, który w moim przypadku nigdy nie będzie istniał).Możesz naśladować idiom C w Pythonie.
Aby odczytać bufor o maksymalnej
max_size
liczbie bajtów, możesz to zrobić:Lub plik tekstowy wiersz po wierszu:
Musisz użyć
while True / break
konstrukcji, ponieważ w Pythonie nie ma testu eof poza brakiem bajtów zwróconych z odczytu.W C możesz mieć:
Jednak nie możesz tego mieć w Pythonie:
ponieważ przypisania nie są dozwolone w wyrażeniach w Pythonie (chociaż najnowsze wersje Pythona mogą to naśladować za pomocą wyrażeń przypisania, patrz poniżej).
Z pewnością w Pythonie jest to bardziej idiomatyczne:
Aktualizacja: od Pythona 3.8 możesz także używać wyrażeń przypisania :
źródło
readline()
: możesz wykonać drobnoziarnistą obsługę błędów, taką jak wyłapywanieUnicodeDecodeError
, czego nie można zrobić z idiomatycznąfor
iteracją.Idiom Pythona do otwierania pliku i czytania go wiersz po wierszu to:
Plik zostanie automatycznie zamknięty na końcu powyższego kodu (
with
zajmuje się tym konstrukcja).Na koniec warto zauważyć, że
line
zachowa końcowy znak nowej linii. Można to łatwo usunąć za pomocą:źródło
for line in f.readlines(): ...
, powszechnie sugerowane rozwiązanie.Możesz użyć poniższego fragmentu kodu, aby czytać wiersz po wierszu, aż do końca pliku
źródło
Chociaż powyżej są sugestie dotyczące "robienia tego w Pythonie", jeśli naprawdę chce się mieć logikę opartą na EOF, przypuszczam, że użycie obsługi wyjątków jest sposobem na zrobienie tego -
Przykład:
Lub naciśnij Ctrl-Zpo wyświetleniu
raw_input()
monitu (Windows, Ctrl-ZLinux)źródło
Możesz użyć następującego fragmentu kodu. readlines () czyta cały plik naraz i dzieli go liniami.
źródło
Oprócz świetnej odpowiedzi @ dawg, równoważne rozwiązanie wykorzystujące operator morsa (Python> = 3,8):
źródło