Відповіді:
Проведіть петлю над файлом, щоб прочитати рядки:
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
Файлові об'єкти є ітерабельними та рядками дохідності до EOF. Використовуючи файловий об'єкт як ітерабельний, використовується буфер для забезпечення виконання читачами.
Ви можете зробити те ж саме з stdin (не потрібно використовувати raw_input()
:
import sys
for line in sys.stdin:
do_something()
Щоб завершити малюнок, двійкові читання можна виконати за допомогою:
from functools import partial
with open('somefile', 'rb') as openfileobject:
for chunk in iter(partial(openfileobject.read, 1024), b''):
do_something()
де chunk
буде містити до 1024 байт одночасно з файлу, і ітерація припиняється, коли openfileobject.read(1024)
починається повернення порожніх рядків байтів.
stdin
запущеного процесу ... так що він ніколи не має EOF, поки я не вб'ю процес. Але потім я доходжу до "кінця до теперішнього часу" і заходжу в тупик. Як виявити це, а не тупик? Начебто, якщо немає нових рядків, перестаньте читати файли (навіть якщо немає EOF, який у моєму випадку ніколи не буде).
Ви можете наслідувати ідіому C в Python.
Щоб прочитати буфер до max_size
кількості байтів, ви можете зробити це:
with open(filename, 'rb') as f:
while True:
buf = f.read(max_size)
if not buf:
break
process(buf)
Або текстовий файл за рядком:
# warning -- not idiomatic Python! See below...
with open(filename, 'rb') as f:
while True:
line = f.readline()
if not line:
break
process(line)
Вам потрібно використовувати while True / break
конструкцію, оскільки в Python немає жодного тесту eof, крім відсутності байтів, повернутих з прочитаного.
У мові C:
while ((ch != '\n') && (ch != EOF)) {
// read the next ch and add to a buffer
// ..
}
Однак у Python цього не може бути:
while (line = f.readline()):
# syntax error
тому що призначення не дозволяється в виразах у Python (хоча останні версії Python можуть імітувати це за допомогою виразів призначення, див. нижче).
Це, звичайно , більш ідіоматичне в Python , щоб зробити це:
# THIS IS IDIOMATIC Python. Do this:
with open('somefile') as f:
for line in f:
process(line)
Оновлення: з Python 3.8 ви також можете використовувати вирази призначення :
while line := f.readline():
process(line)
readline()
способом: ви можете робити дрібнозернисті поводження з помилками, як ловлі UnicodeDecodeError
, чого ви не можете зробити з ідіоматичною for
ітерацією.
Ідіома Python для відкриття файлу та читання його по черзі:
with open('filename') as f:
for line in f:
do_something(line)
Файл автоматично закриється в кінці вищевказаного коду ( with
конструкція про це піклується).
Нарешті, варто зазначити, що line
збережеться нижня лінія. Це можна легко видалити за допомогою:
line = line.rstrip()
for line in f.readlines(): ...
, загальноприйняте рішення.
Ви можете використовувати фрагмент коду нижче для читання рядка за рядком до кінця файлу
line = obj.readline()
while(line != ''):
# Do Something
line = obj.readline()
Хоча вище є пропозиції щодо "робити це пітоном", якщо хочеться по-справжньому мати логіку, засновану на EOF, то я припускаю, що використання обліку виключень - це спосіб зробити це -
try:
line = raw_input()
... whatever needs to be done incase of no EOF ...
except EOFError:
... whatever needs to be done incase of EOF ...
Приклад:
$ echo test | python -c "while True: print raw_input()"
test
Traceback (most recent call last):
File "<string>", line 1, in <module>
EOFError: EOF when reading a line
Або натисніть Ctrl-Zна raw_input()
рядок (Windows, Ctrl-ZLinux)
Ви можете використовувати наступний фрагмент коду. readlines () читає одразу у всьому файлі та розбиває його на рядки.
line = obj.readlines()
Окрім великої відповіді @ dawg, еквівалентне рішення за допомогою оператора моржів (Python> = 3,8):
with open(filename, 'rb') as f:
while buf := f.read(max_size):
process(buf)
line
кінці буде новий символ рядка.