2015-01-29 12 views
69

파이썬 3.4와 함께 파이썬 3.4로 절인 된 오브젝트를로드 할 수 있는지 궁금합니다.파이썬 2와 파이썬 3을 번들 해제했습니다.

2to3을 많은 회사 레거시 코드에서 실행하여 최신 버전으로 업데이트했습니다. 나는 다음과 같은 오류가 파일 실행시

이 다 끝나면 : 경쟁에 절인 개체를보고

File "H:\fixers - 3.4\addressfixer - 3.4\trunk\lib\address\address_generic.py" 
, line 382, in read_ref_files 
    d = pickle.load(open(mshelffile, 'rb')) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 1: ordinal 
not in range(128) 

를,이 유형 str의 키와 값을 포함하는 dict에서 dict입니다.

내 질문은 : 원래 Python 3.4와 함께 파이썬 2.4에서 절인 된 개체를로드 할 수있는 방법이 있습니까?

+0

파이썬 2.4에는'json' 모듈이 있습니까? 아마도 객체를 unpickle 처리하여 json 객체로 저장하는 2.4 스크립트를 작성한 다음 json 객체를 읽고 3.4 호환 피클 객체로 저장하는 3.4 스크립트를 작성할 수 있습니다. 이것은 모든 피클 파일에서 실행되는 일회성 작업입니다. – Kevin

+0

비슷한 줄을 생각해 보았는데, 이것들은 sys.stdout을 파일로 바꾸어 인쇄 할 수는 있지만, 먼저로드 할 수 있는지 알고 싶습니다. – Scironic

답변

110

pickle.load() 파이썬 3 바이트 문자열로 파이썬 bytestring 데이터를 변환하는 방법 또는 pickle에 바이트로 남겨 둘 것을 지정해야합니다.

기본값은 모든 문자열 데이터를 ASCII로 디코딩하고 디코딩이 실패하는 것입니다. pickle.load() documentation 참조 :

Optional keyword arguments are fix_imports, encoding and errors, which are used to control compatibility support for pickle stream generated by Python 2. If fix_imports is true, pickle will try to map the old Python 2 names to the new names used in Python 3. The encoding and errors tell pickle how to decode 8-bit string instances pickled by Python 2; these default to ‘ASCII’ and ‘strict’, respectively. The encoding can be ‘bytes’ to read these 8-bit string instances as bytes objects.

latin1에 인코딩을 설정하면 직접 데이터를 가져올 수 있습니다 :

with open(mshelffile, 'rb') as f: 
    d = pickle.load(f, encoding='latin1') 

을하지만 잘못된 코덱을 사용하여 디코딩하여 문자열의 아무도 없는지 확인해야합니다; Latin-1은 바이트 값 0-255를 처음 256 유니 코드 코드 포인트에 직접 매핑하므로 모든 입력에 사용할 수 있습니다.

데이터를 encoding='bytes'으로로드 한 다음 나중에 키와 값을 bytes 개 모두 디코딩하면됩니다.

+1

어떻게하면 이전 버전과 호환 될 수 있습니까? 파이썬 2? 분명히 인코딩 인수는 파이썬 2에는 없습니다. – EpicAdv

+1

@EpicAdv :이 코드를 파이썬 2와 호환시킬 필요는 없습니다. 이 질문은 파이썬 2 절임을 파이썬 3으로로드하는 방법입니다. –

+6

@EpicAdv : 파이썬 2에서 비어 있거나'encoding '을 가진 pickle_options 사전을 만들 수 있습니다 : \ * \ * pickle_options를 피클에 보냅니다. 이 방법은 두 버전 모두에서 실행되어야합니다. – pipefish

0

encoding = 'latin1'을 사용하면 객체에 numpy 배열이 포함되어있을 때 몇 가지 문제가 발생합니다.

인코딩 = 바이트를 사용하는 것이 좋습니다.

이 부분을 참조하십시오. answer