2010-11-25 5 views
7

로 압축 풀기 : 그것은 잘 작동Unpicking 데이터는 파이썬 3.1에서 다음이 코드를 사용하여 파이썬 2.5 I 저장된 데이터에 ZLIB

def GLWriter(file_name, string): 
    import cPickle 
    import zlib 
    data = zlib.compress(str(string)) 
    file = open(file_name, 'w') 
    cPickle.dump(data, file) 

, 그 과정을 수행하여 데이터를 읽을 수 있었다 역. 그것은 안전 할 필요가 없었으며 인간의 눈에는 읽을 수없는 것이 었습니다. 우리가 지금 파이썬 3.1을 사용하도록 강요하고 여러 가지 이유로

S'x\x9c+I-.\x01\x00\x04]\x01\xc1' 
p1 
. 

우리는이를 읽을 수있는 무언가를 코딩 할 필요가 : 나는 그것으로 "테스트"를 넣어 다음은 생성 된 파일을 열 경우,이처럼 보였다 데이터 파일.

Pickle은 더 이상 문자열 입력을 허용하지 않으므로 "rb"로 파일을 열어야했습니다. 내가 그렇게하고 pickle.load (파일)을 열어하려고 할 때이 오류 얻을 :

File "<stdin>", line 1, in <module> 
File "C:\Python31\lib\pickle.py", line 1365, in load 
    encoding=encoding, errors=errors).load() 
UnicodeDecodingError: 'ascii' codec can't decode byte 0x9c in position 1: ordinal not in range(128) 

내가 피클에서 파일을 열 수 없습니다 수 있음을내는을 좀 연구를 시작 발견 pickle은 zlib이 생성하는 주요 데이터 블록의 양쪽면에 몇 개의 문자를 래핑하는 것입니다. 그런 다음 zlib 출력으로 자르고 zlib.decompress를 통해 출력하려고했습니다. 내 문제는 파일을 읽고 "\ x04"의 좋아하는 것을 하나가 아닌 4 개의 문자로 해석한다는 것입니다. 나중에 많은 테스트와 검색을하고 피클이 파일을로드 할 수있는 방법을 찾지 못하거나 zlib을 통해 python이이 코드를 인식하도록 만들 수 없습니다.

제 질문은 다음과 같습니다. 어떻게 파이썬 3.1을 사용하여 원래의 데이터를 복구 할 수 있습니까?

나는 내 고객에게 Python2.5를 설치하고 수동으로 요청하고 싶지만 그럴 수는 없다.

많은 도움을 주셔서 감사합니다.

답변

10

문제는 파이썬 3이 pickted Python 2 문자열을 이 될 때 str 오브젝트로 변환하려고 시도한다는 것입니다. 이것은 모든 256 8 비트 문자를 지원하지 않는 ascii 코덱을 사용하므로 예외가 발생합니다.

당신은 (모든 256 개 문자를 지원합니다)을 latin-1 인코딩을 사용하고 bytes로 다시 문자열을 인코딩하여이 문제를 해결할 수는 :

s = pickle.load(f, encoding='latin1') 
b = s.encode('latin1') 
print(zlib.decompress(b)) 
+1

와우, 완벽하게 작동합니다. 정말 고마워! –

0

파이썬 3은 이진 데이터 문자열을 구분합니다. 피클은 바이너리 데이터가 필요하지만 텍스트로 파일을 여는 중입니다. 해결책은 다음을 사용하는 것입니다.

open(file_name, 'wb') 
관련 문제