如何避免Python fileinput库中的缓冲
我看到这个问题在这里被问过,但给出的答案在我这儿都不管用,还被标记为重复问题。
python -u
在 Python 3 中对stdin
不起作用。sys.stdin = sys.stdin.detach()
会抛出一个错误:ValueError: underlying buffer has been detached
。- 这些方法都不适用于非
stdin
输入和其他作为流使用的文件。 - 添加钩子也不行:
FileInput(openhook=hook_nobuf)
和在钩子中使用open(buffering=0)
。
我深入查看了源代码(/usr/lib/python3.2/fileinput.py
),发现内部使用了 readlines(bufsize)
来加载缓冲区。没有使用任何 shell 或其他管道的操作。
1 个回答
5
对我有效的方法就是简单地设置 FileInput(bufsize=1)
。在 file.readlines()
的说明中提到:“可选的大小参数,如果提供的话,是对返回行中总字节数的一个大致限制。”实际上,我每次都能准确地得到一行新内容,而不需要先填满一个缓冲区。
with fileinput.input(bufsize=1) as f:
for line in f:
print("One line in, one line out!")