我一直认为在Python中迭代文件就等于在循环中调用它的readline
方法,但今天我发现这种情况并非如此。具体来说,我有一个Popen
'd进程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, "")))
有人可以解释一下这个区别吗?
答案 0 :(得分:5)
差异完全在于迭代与readline
方法的实现。文件迭代以块(默认为8千字节)读取,然后在使用时将缓冲区拆分为行。另一方面,readline
方法注意不要读取多行,这意味着逐个字符地读取。读取块更有效,但这意味着您不能在读取之间混合文件上的其他操作。期望的是,当您迭代文件时,您的意图是按顺序读取所有行,并且您不会对其执行其他操作。 readline
方法不能做出这样的假设。
正如Sven Marnach在对你的问题的评论中暗示的那样,你可以使用iter(f.readline, '')
来获取一个迭代器来读取文件中的行而不用读取块,这会牺牲性能。