2013-02-21 4 views
5

이 질문을 여기에서 보았습니다. 그러나 주어진 답은 필자의 경우에는 작동하지 않았고 중복으로 표시되었습니다.Python fileinput 라이브러리에서 버퍼링을 피하는 방법

나는 소스 코드 (/usr/lib/python3.2/fileinput.py)에 파고 readlines(bufsize)가 버퍼를로드하기 위해 내부적으로 사용되는 것을 보았다. 껍질 또는 기타 배관 헛간은 없습니다.

+0

사실, 필자는 여러분이 필요로하는 것의 위에'python -u'를 원할 수도 있다고 생각합니다. 'stdin'에서 파이썬 및/또는 stdio 버퍼링을 제거하고 싶다면 더 높은 수준의 라인 읽기 버퍼를 제거하십시오. – abarnert

답변

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

+0

그리고'IOBase.readlines' ([pure 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'가 없다면 한 번에 1 바이트 씩'read'를 호출 할 것입니다. 그래서, 나는 그걸 막아 버리고 자신의 대답을 받아 들여야한다고 생각합니다. – abarnert

+0

또한,''fileinput.input'] (http://docs.python.org/3/library/fileinput.html)에'bufsize'가 무엇을 언급하는지에 대한 문서 버그를 제기 할 수도 있습니다 언어 참조는'bufsize = 1' ('stdin'에서 버퍼링되지 않은'stdin'과 함께,'stdin'에서 읽을 때)이 버퍼되지 않은'fileinput'을 의미 함을 보증하기에 충분한 정보를 가져야합니다. – abarnert

관련 문제