2013-02-21 73 views
5

我在这里看到过这个问题,但给出的答案在我的情况下不起作用,并被标记为重复。如何避免在Python文件输入库中缓冲

我挖在源代码(/usr/lib/python3.2/fileinput.py),看到readlines(bufsize)正在内部用于装载的缓冲器。没有外壳或其他管道shenanigans。

+0

实际上,我认为你可能希望'python -u'在你需要的任何东西之上。你想删除'stdin'上任何基础的Python和/或-stdio缓冲区,并且_also_删除任何更高级的行读缓冲区,对吧? – abarnert 2013-02-21 21:30:08

回答

5

什么对我来说是简单的设置FileInput(bufsize=1)工作。 file.readlines()文档确实声明“如果给出,可选大小参数是返回的行中总字节数的近似范围。”在实践中,我每次只准备一个新行,而不必填写缓冲区。

with fileinput.input(bufsize=1) as f: 
    for line in f: 
     print("One line in, one line out!") 
+0

只要'fileinput'使用'readlines(self._bufsize)',它似乎确实可以工作。不幸的是,这本身并没有被记录为真实的,但是如果你只关心CPython 3.2,你可以肯定它是这样的,而且看起来很可能在这之后很安全,所以如果这足够好,那么很好。 – abarnert 2013-02-21 21:34:09

+0

如果你通过'IOBase.readlines'([纯Python](http://hg.python.org/cpython/file/3.2/Lib/_pyio.py#l497)和[C](http:// hg.python.org/cpython/file/3.2/Modules/_io)的实现),它会调用'readline',如果没有缓冲区或'peek',它将一次调用'read' 1个字节。所以,我认为这是收紧的,你应该接受你自己的答案。 – abarnert 2013-02-21 21:41:18

+0

另外,你可能想提出一个文档错误,因为['fileinput.input'](http://docs.python.org/3/library/fileinput.html)没有提到'bufsize'的作用并且语言引用应该有足够的信息来保证'bufsize = 1'(当从stdin读取时,与无缓冲的stdin一起)意味着无缓冲的'fileinput'。 – abarnert 2013-02-21 21:44:50