Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中“whilenoteof”的完美对应是什么_Python_File_Iteration_Eof - Fatal编程技术网

Python中“whilenoteof”的完美对应是什么

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之前,文

要读取一些文本文件,在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之前,文件对象是可编辑的并产生行。将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)