迭代文件和调用readline之间的区别

时间:2012-04-04 13:31:26

标签: python io iterator subprocess pipe

我一直认为在Python中迭代文件就等于在循环中调用它的readline方法,但今天我发现这种情况并非如此。具体来说,我有一个Popen'd进程p其中

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

挂起(大概是因为p等待输入; stdinstdout都是我的Python进程的管道),而以下工作:

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

有人可以解释一下这个区别吗?

1 个答案:

答案 0 :(得分:5)

差异完全在于迭代与readline方法的实现。文件迭代以块(默认为8千字节)读取,然后在使用时将缓冲区拆分为行。另一方面,readline方法注意不要读取多行,这意味着逐个字符地读取。读取块更有效,但这意味着您不能在读取之间混合文件上的其他操作。期望的是,当您迭代文件时,您的意图是按顺序读取所有行,并且您不会对其执行其他操作。 readline方法不能做出这样的假设。

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