Python:从标准输入读取大量行

7

我正在尝试使用Python从标准输入读取大量行。

more hugefile.txt | python readstdin.py

问题在于当我读取了一行后,程序就会冻结。
print sys.stdin.read(8)
exit(1)

这段代码打印前8个字节,但我期望它停止运行,但它从未停止。我认为它并没有真正地只读取了前几个字节,而是试图将整个文件读入内存。

使用sys.stdin.readline()也有同样的问题。

我真正想做的当然是读取所有行,但使用缓冲区,这样我就不会耗尽内存。

我正在使用Python 2.6版本。


4
为什么你使用more而不是cat,甚至只是一个简单的重定向stdin? - Mark Byers
我看不出你的程序为什么会“冻结”。你是如何检测到它冻结的? - Greg Hewgill
啊,我是从 Windows 命令行运行它的。Windows 上没有 cat。 - Martin
3
你为什么选择不使用重定向?即便在Windows系统,使用type也是不必要的。cat命令的目的是连接文件。如果只有一个文件,无需与任何东西连接它会浪费时间和进程。 - Greg Hewgill
那么我们可以得出结论,"huge" == "超过一页"? - Mark Ransom
显示剩余5条评论
2个回答

11

这个应该可以在现代的Python中高效运行:

import sys

for line in sys.stdin:
    # do something...
    print line,

您可以像这样运行该脚本:

python readstdin.py < hugefile.txt

这里的内存是如何工作的?它一次加载一行,并在下一行读入时从缓冲区中删除它吗?谢谢。 - B.Mr.W.
是的,它一次读取一行并将其设置为line变量。旧的line值将在丢失时被回收。 - Gringo Suave

2
“回到过去,你必须使用 xreadlines 来实现高效的逐行 IO。现在的文档建议你使用 for line in file。当然,这只有在你确实需要逐行处理时才有帮助。如果你只是读取大型二进制数据块并将其传递给其他东西,那么你的其他机制可能同样有效。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接