2010-11-27 3 views
29

Python 2.x에서 'file-like'객체 사용 :인코딩을 모른 채 Python 3에서 파일에 바이트를 쓰는 방법은 무엇입니까?

sys.stdout.write(bytes_) 
tempfile.TemporaryFile().write(bytes_) 
open('filename', 'wb').write(bytes_) 
StringIO().write(bytes_) 

Python 3에서 같은 작업을 수행하는 방법은 무엇입니까?

이 Python 2.x 코드와 동등한 코드 작성 방법 :

def write(file_, bytes_): 
    file_.write(bytes_) 

참고 : sys.stdout은 의미 상 텍스트 스트림이 아닙니다. 때로는 바이트 스트림으로 간주하는 것이 좋습니다. 예를 들어, make encrypted archive of dir/ on remote machine :

tar -c dir/ | gzip | gpg -c | ssh [email protected] 'dd of=dir.tar.gz.gpg' 

이 경우 유니 코드를 사용할 필요가 없습니다.

답변

36

문자열이 아닌 바이트로 작동하는 API를 사용하는 문제입니다. docs으로

sys.stdout.buffer.write(bytes_) 

당신은 또한 detach 스트림 수, 설명, 그래서 그들은 기본적으로 바이너리입니다.

기본 바이트 버퍼에 액세스합니다.

tempfile.TemporaryFile().write(bytes_) 

이것은 이미 바이트 API입니다.

open('filename', 'wb').write(bytes_) 

'b'에서 예상했듯이이 바이트 API입니다.

from io import BytesIO 
BytesIO().write(bytes_) 

BytesIOStringIO 동등한 바이트이다.

EDIT : write바이너리 파일과 유사한 개체에서 작동합니다. 따라서 일반적인 해결책은 올바른 API를 찾는 것입니다. 당신이 당신의 파일을 열 때

+0

검사 입력에 의존하지 않고 일반 함수를 작성하는 방법이 있나요 같은 IO isinstance (file_,'으로 .TextIOWrapper)'등 – jfs

+0

@JF, Python 3은 텍스트 대 바이너리 분할을 올바르게 처리하도록 특별히 설계되었습니다. 인코딩을 알지 못하면 바이너리와 텍스트간에 올바른 방법이 없습니다. 따라서 텍스트 스트림에 바이트를 쓰는 일반 함수를 작성하는 방법은 없습니다. Python 3에 대한 다이브는 이것에 대한 좋은 [article] (http://diveintopython3.org/strings.html)을 가지고 있습니다. –

+0

질문은 특히 * bytes *에 관한 것입니다. 예를 들어,'os.write (sys.stdout.fileno(), bytes_)'. – jfs

관련 문제