如何避免Python fileinput缓冲

Joh*_*nck 9 python file-io readline buffering

可能重复:
为sys.stdin设置较小的缓冲区大小?

我有一个Python(2.4/2.7)脚本fileinput用于从标准输入或文件中读取.它易于使用,除了一个案例外,效果很好:

tail -f log | filter.py
Run Code Online (Sandbox Code Playgroud)

问题是我的脚本缓冲了它的输入,而(至少在这种情况下)我希望立即看到它的输出.这似乎源于fileinput 在执行任何操作之前使用它readlines()来获取其bufsize值的字节这一事实.我尝试使用1的bufsize,它似乎没有帮助(这有点令人惊讶).

我确实发现我可以编写这样不缓冲的代码:

while 1:
    line = sys.stdin.readline()
    if not line: break
    sys.stdout.write(line)
Run Code Online (Sandbox Code Playgroud)

这样做的问题是我丢失了fileinput功能(即它会自动打开传递给我程序的所有文件,如果没有则会自动打开stdin,它甚至可以自动解压缩输入文件).

那么我怎样才能充分利用两者呢?理想情况下,我不需要显式管理我的输入文件列表(包括解压缩),但在以"流"方式使用时不会延迟输入.

Joh*_*Jr. 0

你有没有尝试过:

def hook_nobuf(filename, mode):
    return open(filename, mode, 0)

fi = fileinput.FileInput(openhook=hook_nobuf)
Run Code Online (Sandbox Code Playgroud)

没有测试它,但是通过阅读 openhook 参数的作用以及通过 0 来打开 bufsize 参数,这应该可以解决问题。

  • 我是 Python 新手;令人震惊的是,这个用例没有得到很好的覆盖(毕竟,如果不是为了这个,用 Python 编写文本过滤器似乎是很自然的)。 (2认同)