[python] 파이썬 바이너리 파일에 쓰는 방법?

정수로 바이트 목록이 있습니다.

[120, 3, 255, 0, 100]

이 목록을 바이너리로 파일에 어떻게 쓸 수 있습니까?

작동할까요?

newFileBytes = [123, 3, 255, 0, 100]
# make file
newFile = open("filename.txt", "wb")
# write to file
newFile.write(newFileBytes)



답변

이 정확히 무엇을 bytearray위한 것입니다 :

newFileByteArray = bytearray(newFileBytes)
newFile.write(newFileByteArray)

Python 3.x를 사용 bytes하는 경우 대신 사용할 수 있습니다 (의도를 더 잘 알릴 수 있으므로 그래야합니다). 그러나 파이썬 2.x에서, 즉하지 않습니다 작품은, 때문에이 bytes단지의 별칭입니다 str. 평소와 같이 인터랙티브 인터프리터로 보여주는 것이 텍스트로 설명하는 것보다 쉽기 때문에 그렇게하겠습니다.

Python 3.x :

>>> bytearray(newFileBytes)
bytearray(b'{\x03\xff\x00d')
>>> bytes(newFileBytes)
b'{\x03\xff\x00d'

Python 2.x :

>>> bytearray(newFileBytes)
bytearray(b'{\x03\xff\x00d')
>>> bytes(newFileBytes)
'[123, 3, 255, 0, 100]'


답변

사용 struct.pack후 바이트 쓰기, 이진 바이트로 정수 값을 변환 할 수 있습니다. 예

newFile.write(struct.pack('5B', *newFileBytes))

그러나 바이너리 파일에 .txt확장자를 주지 않을 것 입니다.

이 방법의 장점은 다른 유형에서도 작동한다는 것입니다. 예를 들어 값이 255보다 큰 경우 '5i'전체 32 비트 정수를 가져 오는 대신 형식에 사용할 수 있습니다 .


답변

256 미만의 정수에서 이진수로 변환하려면 chr함수를 사용하십시오 . 그래서 당신은 다음을보고 있습니다.

newFileBytes=[123,3,255,0,100]
newfile=open(path,'wb')
newfile.write((''.join(chr(i) for i in newFileBytes)).encode('charmap'))


답변

Python 3.2 이상에서는 to_bytes기본 int 메서드를 사용하여이 작업을 수행 할 수도 있습니다 .

newFileBytes = [123, 3, 255, 0, 100]
# make file
newFile = open("filename.txt", "wb")
# write to file
for byte in newFileBytes:
    newFile.write(byte.to_bytes(1, byteorder='big'))

즉, to_bytes이 경우에 대한 각 단일 호출 은 정수 값을 나타내는 빅 엔디안 순서 (길이 1 문자열의 경우 사소함)로 배열 된 문자를 사용하여 길이 1의 문자열을 생성합니다 byte. 마지막 두 줄을 단일 줄로 줄일 수도 있습니다.

newFile.write(''.join([byte.to_bytes(1, byteorder='big') for byte in newFileBytes]))


답변

Python 3 구문을 사용하여 다음 코드 예제를 사용할 수 있습니다.

from struct import pack
with open("foo.bin", "wb") as file:
  file.write(pack("<IIIII", *bytearray([120, 3, 255, 0, 100])))

다음은 쉘 한 줄짜리입니다.

python -c $'from struct import pack\nwith open("foo.bin", "wb") as file: file.write(pack("<IIIII", *bytearray([120, 3, 255, 0, 100])))'


답변

다음과 같이 pickle을 사용하십시오. import pickle

코드는 다음과 같습니다.

import pickle
mybytes = [120, 3, 255, 0, 100]
with open("bytesfile", "wb") as mypicklefile:
    pickle.dump(mybytes, mypicklefile)

데이터를 다시 읽으려면 pickle.load 메소드를 사용하십시오.


답변