2011-10-11 3 views
4

저는 파이썬에서 1과 0의 문자열을 가지고 있고 그것을 바이너리 파일에 쓰고 싶습니다. 이 작업을 수행하는 좋은 방법을 찾는 데 많은 어려움을 겪고 있습니다.파이썬 : 1과 0의 문자열 -> 바이너리 파일

이 작업을 수행하는 표준 방법이 있습니까? 8 비트의 조각으로 귀하의 의견은 다음 int(_, 2)chr을 적용

+2

와 리눅스 쉘에서입니다 테스트 할 수 있습니다. 이 끈은 어디에서 왔습니까? –

+3

"바이너리 파일"과 같은 의미있는 것은 없습니다. 모든 파일은 '바이너리'입니다. 그들은 일련의 비트를 포함합니다. ** ** 당신이 의미하는 것은 ** "나는 문자열의 각 '1'과 '0'문자를 단일 비트로 해석하고, 8 비트를 바이트로 그룹화하고 결과를 파일에 씁니다. –

+0

@KarlKnechtel. 물론 그래, 그게 내가하고 싶은 일이야. 하지만 나는 아래에 제안 된 리오 리와 같은 방식으로 그렇게하려고 할 때 오류가 발생합니다. 나는 그 문제를 조금 아래에서 설명했다. – sevandyk

답변

2
In [1]: int('10011001',2) 
Out[1]: 153 

분할 후 문자열로 연결할 및 파일에이 문자열을 작성합니다.

뭔가 같은 ... :

your_file.write(''.join(chr(int(your_input[8*k:8*k+8], 2)) for k in xrange(len(your_input)/8))) 
+0

이것은 내가하려고했던 것이지만, 문자열을 쓰려고 할 때 UnicodeEncodeError가 발생합니다. 분명히 이것은 문자열에서 ascii가 지원하지 않는 문자가 있기 때문입니다. 그러나 chr()의 doc은 ascii 문자 만 반환한다고 말합니다. 생각? – sevandyk

+0

@sevandyk : 파이썬 3입니까? 당신의 0과 1의 문자열은 실제로 유니 코드 객체입니까? 파일을 이진 모드 ('open (..., 'wb')')로 여는가? – liori

8

당신이 바이너리 파일을 원하는 경우에,

>>> import struct 
>>> myFile=open('binaryFoo','wb') 
>>> myStr='10010101110010101' 
>>> x=int(myStr,2) 
>>> x 
76693 
>>> struct.pack('i',x) 
'\x95+\x01\x00' 
>>> myFile.write(struct.pack('i',x)) 
>>> myFile.close() 
>>> quit() 
$ cat binaryFoo 
�+$ 

이 당신이 찾고있는 무엇인가?

+0

myStr의 가능한 값은 매우 낮습니다 ('i'형식은 -2147483648 <= number <= 2147483647). 그것을 더 작은 값으로 분해해야합니다. 그럼에도 불구하고 질문에 진정으로 대답하기에 충분한 정보가 제공되지 않습니다. –

+0

@oxtopus, 범위가 제한되어 있다고 동의합니다. 그러나 당신은 다른 방법으로 무엇을 제안하겠습니까? –

+0

@oxtopus는 정보가 충분하지 않다고 동의했지만, 우리 모두는 같은 방식으로 OP를 읽는 것 같습니다. :) –

0
BITS_IN_BYTE = 8 
chars = '00111110' 
bytes = bytearray(int(chars[i:i+BITS_IN_BYTE], 2) 
    for i in xrange(0, len(chars), BITS_IN_BYTE)) 
open('filename', 'wb').write(bytes) 
0

은 또는 당신은 비트 스트링 모듈은 당신이 필요 않는 지금이이

$ python 
Python 2.7.2+ (default, Oct 4 2011, 20:06:09) 
[GCC 4.6.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import random,array 
#This is the best way, I could think of for coming up with an binary string of 100000 
>>> binStr=''.join([str(random.randrange(0,2)) for i in range(100000)]) 
>>> len(binStr) 
100000 
>>> a = array.array("c", binStr) 
#c is the type of data (character) 
>>> with open("binaryFoo", "ab") as f: 
...  a.tofile(f) 
... 
#raw writing to file 
>>> quit() 
$ 
0

처럼 array 모듈을 사용할 수 있습니다.

from bitstring import BitArray 

my_str = '001001111' 
binary_file = open('file.bin', 'wb') 
b = BitArray(bin=my_str) 
b.tofile(binary_file) 
binary_file.close() 

당신은 표준 방법은 "1"과 "0"의 문자열 트래픽에 결코 xxd -b file.bin