2013-02-21 52 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

相關問題