Answers:
循环遍历文件以读取行:
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,在我看来,它也不存在)。
您可以在Python中模仿C语言。
要读取不超过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()
方式有一个优点:您可以执行细粒度的错误处理,例如catch UnicodeDecodeError
,而惯用for
迭代则无法做到。
您可以使用下面的代码片段逐行读取,直到文件结尾
line = obj.readline()
while(line != ''):
# Do Something
line = obj.readline()
尽管上面有“以python方式实现”的建议,但如果真的想有一个基于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()
line
的结尾处会有一个换行符。