Faça um loop no arquivo para ler as linhas:
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
Os objetos de arquivo são iteráveis e geram linhas até EOF. Usar o objeto de arquivo como um iterável usa um buffer para garantir leituras de desempenho.
Você pode fazer o mesmo com o stdin (não há necessidade de usar raw_input()
:
import sys
for line in sys.stdin:
do_something()
Para completar a imagem, as leituras binárias podem ser feitas com:
from functools import partial
with open('somefile', 'rb') as openfileobject:
for chunk in iter(partial(openfileobject.read, 1024), b''):
do_something()
onde chunk
conterá até 1024 bytes por vez do arquivo, e a iteração para quando openfileobject.read(1024)
começa a retornar cadeias de bytes vazias.
line
terá um novo caractere de linha no final.stdin
processo em execução ... portanto, nunca terá EOF até que eu mate o processo. Mas então eu chego ao "fim até agora" e entro em um impasse. Como faço para detectar isso e não um deadlock? Como se não houvesse novas linhas, pare de ler os arquivos (mesmo que não exista um EOF, que no meu caso nunca existirá).Você pode imitar o idioma C em Python.
Para ler um buffer de até um
max_size
número de bytes, você pode fazer o seguinte:Ou um arquivo de texto linha por linha:
Você precisa usar
while True / break
construct, uma vez que não há teste eof em Python além da falta de bytes retornados de uma leitura.Em C, você pode ter:
No entanto, você não pode ter isso em Python:
porque atribuições não são permitidas em expressões em Python (embora versões recentes de Python possam simular isso usando expressões de atribuição, veja abaixo).
Certamente é mais idiomático em Python fazer isso:
Atualização: desde o Python 3.8, você também pode usar expressões de atribuição :
fonte
readline()
: você pode fazer um tratamento de erros refinado, como a capturaUnicodeDecodeError
, o que não pode ser feito com afor
iteração idiomática .O idioma Python para abrir um arquivo e lê-lo linha por linha é:
O arquivo será fechado automaticamente no final do código acima (a
with
construção cuida disso).Finalmente, é importante notar que
line
preservará a nova linha final. Isso pode ser facilmente removido usando:fonte
for line in f.readlines(): ...
, solução comumente sugerida.Você pode usar o trecho de código abaixo para ler linha por linha, até o final do arquivo
fonte
Embora existam sugestões acima para "fazer do jeito python", se alguém realmente quiser ter uma lógica baseada em EOF, então suponho que usar o tratamento de exceções é a maneira de fazer isso -
Exemplo:
Ou pressione Ctrl-Zem um
raw_input()
prompt (Windows, Ctrl-ZLinux)fonte
Você pode usar o seguinte trecho de código. readlines () lê todo o arquivo de uma vez e o divide por linha.
fonte
Além da ótima resposta de @dawg, a solução equivalente usando o operador walrus (Python> = 3.8):
fonte