>

stdin에서 줄을 읽는 것이 파이썬의 stdin.buffer에서 읽지 못하는 이유

스 니펫 :

import sys
a = sys.stdin.readline()
b = sys.stdin.buffer.readline()
print("A :: {}".format(a))
print("B :: {}".format(b))

<

실행  stdin으로 파일을 제공하는 연산자. python script.py < text.txt

출력 :

A :: Line_1
B :: b''

파일 :

Line_1
Line_2
Line_3

B가 Line_2를 인쇄하지 않는 이유는 무엇입니까? <시간>
업데이트 :

구성은 동일하지만 순서가 변경된 스 니펫

import sys
b = sys.stdin.buffer.readline()
a = sys.stdin.readline()
print("A :: {}".format(a))
print("B :: {}".format(b))

출력 :

A :: Line_2
B :: Line_1

  • 답변 # 1

    stdin에서 직접 읽는 것은 기본 바이트 버퍼 스트림을 소비합니다. 소비되는 양은 내부 구현의 일부이며 사용자가 제어하지 않습니다. 그러나 stdin에서 텍스트 내용을 읽으면 적어도 버퍼에서 몇 바이트를 소비하는 것이 논리적입니다 (효율성). 이유는 더 많이 소비 할 수 있습니다).

    동일한 응용 프로그램에서 두 가지 방식으로 stdin에서 읽으려고 시도하는 것이 타당하지 않기 때문에이 문제에 부딪 치는 사람은 거의 없습니다. 텍스트 데이터와 상호 작용하거나 이진 데이터와 상호 작용할 것입니다. (이 경우 바이너리 데이터에 텍스트가있는 경우 수동으로 처리하고 Python 코드에 문자 집합 디코딩 및 라인 끝 번역을 명시 적으로 적용하는 것입니다.

    즉, 내부 구현은 변환을 위해 읽은 내용보다 먼저 버퍼를 사용합니다.

    올바른 일 : 버퍼 또는 텍스트 계층과 상호 작용하고 응용 프로그램의 수명 동안 만 상호 작용하도록 선택하십시오.

  • 답변 # 2

    문서에서 buffer  object는 텍스트가 아닌 이진 데이터와 함께 사용하도록 설계되었습니다.

    와이즈 비즈

    NoteTo write or read binary data from/to the standard streams, use the underlying binary buffer object. For example, to write bytes to stdout, use sys.stdout.buffer.write(b'abc'). However, if you are writing a library (and do not control in which context its code will be executed), be aware that the standard streams may be replaced with file-like objects like io.StringIO which do not support the buffer attribute.

  • 이전 Cypress는 다중 창 및 다중 탭을 지원하지 않으므로 두 가지를 모두 처리하는 방법
  • 다음 django - 동일한 post_detail 페이지에서 게시물에 대한 댓글 편집/삭제 구현