什么是完美的对手在Python“而不是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。 使用文件对象作为迭代使用缓冲区来确保高性能的读取。

你可以使用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), ''): do_something() 

其中chunk将一次从文件中包含多达1024个字节。

你可以在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中没有eoftesting 。

在C中,你可能有:

 while ((ch != '\n') && (ch != EOF)){ // read the next ch and add to a buffer // .. } 

但是,你不能在Python中有这个:

  while(line=f.readline()): # syntax error 

因为Python 中的expression式不允许赋值 。

在Python中肯定习惯于这样做:

 # THIS IS IDIOMATIC Python. Do this: with open('somefile') as f: for line in f: process(line) 

用于打开文件并逐行阅读的Python成语是:

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

该文件将在上述代码结束时自动closures( with结构负责)。

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

 line = line.rstrip() 

虽然上面提到了“做python的方法”,但是如果我们真的想要一个基于EOF的逻辑,那么我认为使用exception处理就是这样做的 –

 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()提示符(Windows, Ctrl-Z Linux)上按Ctrl-Z

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

 line = obj.readline() while(line != ''): # Do Something line = obj.readline() 

您可以使用下面的代码片段。 readlines()一次读入整个文件并按行分割。

 line = obj.readlines()