6

我一直认为在 Python 中迭代类文件相当于readline循环调用它的方法,但今天我发现情况并非如此。具体来说,我有一个' Popend 过程p

list(itertools.takewhile(lambda x: x != "\n",
                         p.stdout))

挂起(可能是因为p等待输入;两者stdin都是stdout我的 Python 进程的管道),而以下工作:

list(itertools.takewhile(lambda x: x != "\n",
                         iter(p.stdout.readline, "")))

有人可以解释其中的区别吗?

4

1 回答 1

5

区别纯粹在于迭代与readline方法的实现。文件迭代读取块(默认为 8 KB),然后在使用缓冲区时将缓冲区拆分为行。readline另一方面,该方法注意不要读取超过一行,这意味着逐个字符地读取。在块中读取效率更高,但这意味着您不能在读取之间混合文件上的其他操作。期望是,当您遍历文件时,您的意图是顺序读取所有行,并且您不会对其进行其他操作。该readline方法不能做出这样的假设。

正如 Sven Marnach 在他对您的问题的评论中暗示的那样,您可以使用以牺牲性能为代价获取一个从文件中读取行而不读取块iter(f.readline, '')的迭代器。

于 2012-04-04T14:02:36.960 回答