Fre*_*Foo 6 python io iterator subprocess pipe
我一直认为迭代在Python中的文件类似于在readline循环中调用它的方法,但今天我发现这种情况并非如此.具体来说,我有一个Popen过程p在哪里
list(itertools.takewhile(lambda x: x != "\n",
p.stdout))
Run Code Online (Sandbox Code Playgroud)
挂起(大概是因为p输入等待;二者stdin,并stdout都管我的Python进程),而以下工作:
list(itertools.takewhile(lambda x: x != "\n",
iter(p.stdout.readline, "")))
Run Code Online (Sandbox Code Playgroud)
有人可以解释这个区别吗?
区别仅在于迭代与readline方法的实现上。文件迭代读取块(默认为8 KB),然后在消耗它们时将缓冲区分成几行。readline另一方面,该方法要注意不要读取多于一行,这意味着逐个字符地读取。块读取效率更高,但这意味着您不能在两次读取之间混合使用文件的其他操作。期望当您遍历文件时,您的意图是顺序读取所有行,并且您将不会对该文件进行其他操作。该readline方法不能做那个假设。
正如Sven Marnach在对您的问题的评论中所暗示的那样,您可以使用iter(f.readline, '')一个迭代器来从文件中读取行而不以块为单位进行读取,而这会降低性能。