Python中“whilenoteof”的完美对应是什么
要读取一些文本文件,在C或Pascal中,我总是使用以下代码段读取数据,直到EOF:Python中“whilenoteof”的完美对应是什么,python,file,iteration,eof,Python,File,Iteration,Eof,要读取一些文本文件,在C或Pascal中,我总是使用以下代码段读取数据,直到EOF: while not eof do begin readline(a); do_something; end; 因此,我想知道如何在Python中实现这一简单而快速的功能 在文件上循环以读取行: with open('somefile') as openfileobject: for line in openfileobject: do_something() 在EOF之前,文
while not eof do begin
readline(a);
do_something;
end;
因此,我想知道如何在Python中实现这一简单而快速的功能 在文件上循环以读取行:
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
在EOF之前,文件对象是可编辑的并产生行。将file对象用作iterable使用缓冲区来确保读取性能
无需使用原始输入,您可以对标准输入进行相同操作:
要完成图片,可通过以下方式进行二进制读取:
from functools import partial
with open('somefile', 'rb') as openfileobject:
for chunk in iter(partial(openfileobject.read, 1024), b''):
do_something()
其中chunk一次最多包含文件中的1024个字节,当openfileobject.read1024开始返回空字节字符串时,迭代停止。用于打开文件并逐行读取的Python习惯用法是:
with open('filename') as f:
for line in f:
do_something(line)
该文件将在上述代码结束时自动关闭,由构造负责
最后,值得注意的是,行将保留尾随的换行符。可通过以下方式轻松移除:
line = line.rstrip()
您可以在Python中模仿C习惯用法 要读取最大字节数的缓冲区,可以执行以下操作:
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中除了缺少读取返回的字节之外,还存在其他问题
在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,您还可以使用:
您可以使用下面的代码段逐行读取,直到文件结束
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
或者在原始输入提示窗口按Ctrl-Z,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关键字,因为当没有文件对象的引用时,文件将自动关闭。+1,还向OP指出,这与f.readlines:…(一种常用的建议解决方案)中的for行不同。@MartijnPieters:现在是:-作为C和Perl程序员,你的观点对我来说至关重要。while True:方法在每次迭代需要对多个输入行进行操作时也很有用,但就我所知,惯用Python不允许这样做。如果不对文件进行假设,就不应该阅读行。二进制文件可能有很多行…非惯用的readline方式似乎有一个优势:您可以进行细粒度的错误处理,比如捕获UnicodeDecodeError,这是迭代的惯用用法所不能做到的。@TessellingHeckler不是这样说的:当一个内置函数input或raw_input在没有读取任何数据的情况下遇到文件结束条件EOF时引发。@Tadhgmandon Jensen嘿,它会的。真奇怪。虚假声明被撤回,不公平的否决票被删除。依我看,这是一个最能反映问题的答案。经常重复这些行会扭曲程序的结构。例如,在语言解析器中,您希望读取行并按顺序处理它们。您不希望重新构造顶层,以便可以循环读取行,然后将它们发送给解析器。注意:行的末尾将有一个新行字符。读取行对于一般二进制文件来说有点危险,因为可能你有一条6GiB长的线…@LtWorf:这就是为什么我展示了如何以块而不是行的形式读取二进制文件。我从一个正在运行的进程中读取stdin…所以在我杀死该进程之前它不会有EOF。但到现在为止,我走到了尽头,我陷入了僵局。如何检测这一点而不是死锁?比如,如果没有新行,即使没有EOF,也要停止读取文件,在我的情况下,EOF永远不会存在。@CharlieParker:如果出现死锁,那么可能是有什么东西忘记刷新缓冲区了。没有一个真正的MCVE,很难说更多。
with open(filename, 'rb') as f:
while buf := f.read(max_size):
process(buf)
for line in open('myfile.txt', 'r'):
print(line)