파이썬 3에서 바이너리 데이터를 stdout에 쓰는 방법은 무엇입니까?


103

파이썬 2.x에서는 다음과 같이 할 수 있습니다.

import sys, array
a = array.array('B', range(100))
a.tofile(sys.stdout)

그러나 이제 나는 TypeError: can't write bytes to text stream. 사용해야하는 비밀 인코딩이 있습니까?


4
파이썬 2.6+ 및 3.x와 함께 작동합니다 답변 찾기 위해 더 나은 것
소린

2
os.writePy2와 Py3 모두에서 작동합니다.
David Wolever 2014

답변:


169

더 나은 방법 :

import sys
sys.stdout.buffer.write(b"some binary data")

4
를 사용 하면 소스 파일 객체가 문자열이 아닌 바이트를 제공 sys.stdout.buffer하는 shutil.copyfileobj경우에도 사용과 같은 작업을 수행 할 수 있습니다 . +1
csl

1
이를 사용하는 프로그램은 IDLE 3에서 테스트 할 수 없습니다.AttributeError: 'PseudoOutputFile' object has no attribute 'buffer'
Damian Yerrick

4
IDLE의 @DamianYerrick (적어도 Windows에서는) pythonw.exe이 IDLE을 실행하므로 stdout이 없습니다. tkinter로 에뮬레이션됩니다. 물리적으로 바이트를 처리 할 수 ​​없습니다. 이 경우 .decode('UTF-8', errors='replace')문자열을 사용하거나 python3 -I <filename>IDLE을 사용하는 대신 REPL을 얻기 위해 실행 합니다.
Artyer

stderr와 함께 사용 하는 경우 에 쓸 때 쓰기 순서를 메시지로 표시 print(file=sys.stderr)합니다.
Kotauskas

15
import os
os.write(1, a.tostring())

또는 os.write(sys.stdout.fileno(), …)그것이 1당신 보다 더 읽기 쉬운 경우 .


감사합니다. 약간 hack-ish 느낌이 들지만 일반적인 일이 아니라고 생각합니다.
Ivan Baldin

6
문제 os.write는 모든 것이 쓰여질 것이라는 보장이 없기 때문에 반환 값을 확인해야한다는 것입니다.
mic_e

10

Python 3에서만 사용할 수있는 관용적 인 방법은 다음과 같습니다.

with os.fdopen(sys.stdout.fileno(), "wb", closefd=False) as stdout:
    stdout.write(b"my bytes object")
    stdout.flush()

좋은 부분은 파이썬에서 모두가 익숙한 일반 파일 객체 인터페이스를 사용한다는 것입니다.

블록을 종료 할 때 closefd=False닫히지 않도록 설정 sys.stdout하고 with있습니다. 그렇지 않으면 프로그램이 더 이상 stdout으로 인쇄 할 수 없습니다. 그러나 다른 종류의 파일 설명 자의 경우 해당 부분을 건너 뛸 수 있습니다.


왜 플러시합니까? 파이썬이 언제 stdout을 플러시할지 결정하도록하는 것이 더 낫지 않습니까?
Martin

0

python3에서 인코딩을 지정하려면 아래와 같이 bytes 명령을 계속 사용할 수 있습니다.

import os
os.write(1,bytes('Your string to Stdout','UTF-8'))

여기서 1은 stdout-> sys.stdout.fileno ()에 해당하는 일반적인 숫자입니다.

그렇지 않으면 인코딩에 신경 쓰지 않으면 다음을 사용하십시오.

import sys
sys.stdout.write("Your string to Stdout\n")

인코딩없이 os.write를 사용하려면 아래를 사용해보십시오.

import os
os.write(1,b"Your string to Stdout\n")

1
사용하는 프로그램 os.write(sys.stdout.fileno(), some_bytes)은 IDLE에서 작동하지 않습니다. io.UnsupportedOperation: fileno
Damian Yerrick

@DamianYerrick : 당신 말이 맞아요 ... 어쨌든 IDLE은 그런 것을 테스트하기 위해 사용해서는 안됩니다. 곧 : IDLE (python3.5.1 셸이 있음)를 열고 단순히 sys 및 sys.stdout.fileno () 가져 오기를 시도하면 IDLE에서 지원되지 않는 작업이므로 io 오류가 발생합니다. :-) 항상 중요합니다 당신이 어떤 환경에서 일하고 있는지 기억하고 가능한 것을 얻으려고 노력하십시오;) 이것이 당신의 질문을 명확히하기를 바랍니다 :-) 즐거운 주말 보내십시오.
Marco smdm

stdout마지막에 실제 바이너리 데이터를 쓰는 한 가지 방법 만 언급 합니다.
Kotauskas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.