2014-02-15 2 views
0

저는 현재 PPM 파일을 구문 분석하는 방법을 배우려고합니다. 나는 파이썬 인터프리터에서 다음을 수행했다.struct.unpack 및 struct.pack은 어떻게 작동합니까?

>>> x = open('file.ppm') 
>>> x.readline() 
'P6\n' 
>>> x.readline() 
'2 3\n' 
>>> x.readline() 
'255\n' 
>>> x.readline() 
'\n' 
>>> x.readline() 
'\x174R\x03\xd7\x1e\xb5e!-\xcd(D\\oL\x01' 

나는 PPM 파일의 기본 구조를 알고있다. 그러나 나는 마지막 줄에 대해 가장 궁금하다. 픽셀의 색 정보가 포함 된 바이트 인코딩입니다. 이 파일은 위의 struct.pack('B',x)를 사용하여

P6 
2 3 
255 
10 23 52 82 3 215 30 181 101 33 45 205 40 68 92 111 76 1 

로 다시 분석해야한다, 나는 정수 위의 바이트 인코딩으로 챙겨 것을 알 수있다. 그러나 struct.unpack을 사용하여이 프로세스를 취소하는 방법을 잘 모르겠습니다. 가장 중요한 것은, 모두 같은 줄에 나타나기 때문에 각각의 바이트 인코딩을 잘랐는지 잘 모르겠다. 그리고 각각은 같은 길이 (?)로 보이지 않는다.

나는 또한 struct.pack('I','\x174R\x03\xd7\x1e\xb5e!-\xcd(D\\oL\x01')을 수행하여 전체 줄을 꾸리려고했다. 바이트 인코딩을 정수로 직접 변환 할 수없는 이유를 모르겠습니다.

struct.pack(...)을 사용하여 바이트 인코딩을 다시 정수로 구문 분석 할 수 있습니까? 또한, 그 값들이 패킹/언 패킹 될 때 어떤 일이 일어나고 있습니까?

+0

문서의 형식 문자열 섹션을 읽는 것이 도움이 될 수 있습니다 : http://docs.python.org/2/library/struct.html#struct-format-strings – wolfrevo

+1

텍스트 모드에서 파일을 열지 마십시오 '.readline()'을 사용하십시오. 바이너리 모드로 열려면 섹션을 읽는 대신'.read (number_of_bytes)'를 사용하십시오. 텍스트 모드에서 플랫폼 특정 라인 터미네이터는'\ n' 개행 문자로 변환되며 이는 일반적으로 바이너리 파일 읽기에서 원하는 것이 아닙니다. 마지막 하나의'.readline()'의'\ n'은 마지막'.readline()'으로 읽은 섹션의 일부입니다. –

답변

0

처음 세 개의 문자열은 struct.pack으로 채워지지 않습니다. 공백을 없애려면 간단히 사용하십시오 (strip 또는 rstrip). 마지막 바이트

>>> 'P6\n' 
'P6\n' 
>>> 'P6\n'.rstrip() 
'P6' 

:

>>> b = b'\x174R\x03\xd7\x1e\xb5e!-\xcd(D\\oL\x01' 
>>> struct.unpack('%dB' % len(b), b) 
(23, 52, 82, 3, 215, 30, 181, 101, 33, 45, 205, 40, 68, 92, 111, 76, 1) 

또는 bytearray를 사용하여 : (당신은 대신 파이썬 3.x의에서 bytes을 사용할 수 있습니다) bytearray을 반복하면 ints가 산출됩니다.

>>> list(bytearray(b)) 
[23, 52, 82, 3, 215, 30, 181, 101, 33, 45, 205, 40, 68, 92, 111, 76, 1] 

참고 마티 피에 터스는 주석으로, 당신은 더 나은 당신이 바이너리 데이터를 처리하고 바이너리 모드로 파일을 열 것입니다.

f = open('file.ppm', 'rb') # b: binary mode 
+0

'\ n'이 데이터의 일부가되어야한다는 것에주의하십시오. 텍스트 모드에서 이진 형식을 읽는 것은 좋지 않습니다. –

+0

@MartijnPieters, 감사합니다. 나는 대답을 업데이트했다. – falsetru

관련 문제