Programing

Python의 바이너리 버퍼

lottogame 2020. 12. 24. 23:21
반응형

Python의 바이너리 버퍼


Python에서는 문자 데이터에 대한 파일 유사 버퍼로 StringIO사용할 수 있습니다 . 메모리 매핑 파일은 기본적으로 이진 데이터에 대해 유사한 작업을 수행하지만 기본으로 사용되는 파일이 필요합니다. 파이썬은 바이너리 데이터를위한 파일 객체를 가지고 있고 자바의 ByteArrayOutputStream 과 동등한 메모리 전용 입니까?

내가 가진 사용 사례는 메모리에 ZIP 파일을 만들고 싶습니다. ZipFile 에는 파일과 같은 객체가 필요합니다.


아마도 io.BytesIO 클래스를 찾고있을 것입니다 . 바이너리 데이터를 지원한다는 점을 제외하면 StringIO와 똑같이 작동합니다.

from io import BytesIO
bio = BytesIO(b"some initial binary data: \x00\x01")

StringIO는 TypeError를 발생시킵니다.

from io import StringIO
sio = StringIO(b"some initial binary data: \x00\x01")

유니 코드 데이터를 입력하지 않고 StringIO사용하지 않도록주의하는 한 cStringIO괜찮습니다.

StringIO 문서 에 따르면 유니 코드 또는 8 비트를 유지하는 한 모든 것이 예상대로 작동합니다. 아마도 StringIO누군가가 f.write(u"asdf")(내가 아는 한 ZipFile 이하 지 않는)을 할 때 특별한 일을 할 것 입니다. 어쨌든;

import zipfile
import StringIO

s = StringIO.StringIO()
z = zipfile.ZipFile(s, "w")
z.write("test.txt")
z.close()
f = file("x.zip", "w")
f.write(s.getvalue())
s.close()
f.close()

예상대로 작동하며 결과 아카이브의 파일과 원본 파일간에 차이가 없습니다.

이 접근 방식이 작동하지 않는 특정 사례를 알고 있다면 그것에 대해 가장 관심이 있습니다. :)


구조체 패키지 https://docs.python.org/library/struct.html 을 살펴보면 문자열을 압축 된 바이너리 데이터로 해석 할 수 있습니다.

이것이 귀하의 질문에 완전히 대답하는지 확실하지 않지만 struct.unpack ()을 사용하여 바이너리 데이터를 python 객체로 변환 할 수 있습니다.


import struct
f = open(filename, "rb")
s = f.read(8)
x, y = struct.unpack(">hl", s)

이 예제에서 ">"는 big-endian을 읽으라고 "h"는 2 바이트 short를 읽고 "l"은 4 바이트 길이를 나타냅니다. 이진 데이터에서 읽을 필요가있는 것으로 분명히 변경할 수 있습니다.

참조 URL : https://stackoverflow.com/questions/25116/binary-buffer-in-python

반응형