我一直认为在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,"")))
有人可以解释这个区别吗?
最佳答案
差异完全在于迭代与readline方法的实现.文件迭代以块(默认为8千字节)读取,然后在使用时将缓冲区拆分为行.另一方面,readline方法注意不要读取多行,这意味着逐个字符地读取.读取块更有效,但这意味着您不能在读取之间混合文件上的其他操作.期望的是,当您迭代文件时,您的意图是按顺序读取所有行,并且您不会对其执行其他操作. readline方法无法做出这种假设.
正如Sven Marnach在对你的问题的评论中暗示的那样,你可以使用iter(f.readline,”)来获取一个迭代器,它从文件读取行而不读取块,但代价是性能.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。