Python 中“ while not EOF”的完美对应词是什么

为了读取一些文本文件,在 C 或 Pascal 中,我总是使用以下代码片段来读取数据,直到 EOF:

while not eof do begin
readline(a);
do_something;
end;

因此,我想知道如何在 Python 中简单快速地完成这项工作?

413130 次浏览

循环文件以读取行:

with open('somefile') as openfileobject:
for line in openfileobject:
do_something()

文件对象是可迭代的,并且在 EOF 之前产生行。使用 file 对象作为迭代器使用缓冲区来确保性能读取。

您可以对 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)开始返回空字节字符串时迭代停止。

用于打开文件并逐行读取它的 Python 习惯用法是:

with open('filename') as f:
for line in f:
do_something(line)

该文件将在上述代码结束时自动关闭(with构造负责此事)。

最后,值得注意的是,line将保留尾随的换行。这可以很容易地删除使用:

line = line.rstrip()

您可以在 Python 中模仿 C 习惯用法。

对于 读取缓冲区max_size(> 0)的字节数,您可以这样做:

with open(filename, 'rb') as f:
while True:
buf = f.read(max_size)
if buf == 0:
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 中还有 没有测试结果

在 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)

即使行读取为空,并且一直持续到 EOF,这也是有效的。

您可以使用下面的代码片段逐行读取,直到文件结束

line = obj.readline()
while(line != ''):


# Do Something


line = obj.readline()

可以使用下面的代码段。Readlines ()一次读入整个文件,并按行对其进行分割。

line = obj.readlines()

虽然上面有一些关于“使用 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

或者在 raw_input()提示符下按 Ctrl-Z(Windows,Ctrl-Z Linux)

除了@Dawg 的绝妙答案,使用 Walrus 运算符(Python > = 3.8)的等价解决方案是:

with open(filename, 'rb') as f:
while buf := f.read(max_size):
process(buf)

这样吧,简单点!

for line in open('myfile.txt', 'r'):
print(line)

没必要浪费额外的线路。而且不需要使用 with关键字,因为当没有文件对象的引用时,文件将自动关闭。