[python] Python 3으로 Python 2 객체 언 클링

Python 2.4에서 Python 3.4로 절인 객체를로드하는 방법이 있는지 궁금합니다.

대량의 회사 레거시 코드에서 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)

경쟁에 절인 객체를 보면, 그것은있어 dictA의 dict유형의 키와 값을 포함 str.

그래서 내 질문은 : 파이썬 3.4에서 원래 python 2.4에서 절인 객체를로드하는 방법이 있습니까?



답변

pickle.load()파이썬 pickle바이트 문자열 데이터를 파이썬 3 문자열로 변환하는 방법 을 알려주 거나 바이트로 남겨 둘 수 있습니다.

기본값은 모든 문자열 데이터를 ASCII로 시도하고 디코딩하는 것이며 해당 디코딩에 실패합니다. pickle.load()설명서를 참조하십시오 :

선택적 키워드 인수는 fix_imports , encodingerrors 이며, 이는 Python 2에서 생성 된 피클 스트림에 대한 호환성 지원을 제어하는 ​​데 사용됩니다. fix_imports 가 true 인 경우 pickle은 이전 Python 2 이름을 Python 3에서 사용 된 새 이름으로 맵핑하려고 시도합니다. 인코딩오류 는 피클에게 파이썬 2에 의해 절인 8 비트 문자열 인스턴스를 디코딩하는 방법을 알려줍니다. 이들은 각각 ‘ASCII’및 ‘strict’로 설정됩니다. 인코딩 바이트 개체로이 8 비트 문자열 인스턴스를 읽기 ‘바이트’가 될 수 있습니다.

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

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

그러나 잘못된 코덱을 사용하여 문자열을 디코딩하지 않았는지 확인해야합니다. Latin-1은 바이트 값 0-255를 첫 번째 256 개의 유니 코드 코드 포인트에 직접 매핑하므로 모든 입력에서 작동합니다.

대안은로 데이터를로드하고 나중에 encoding='bytes'모든 bytes키와 값을 디코딩하는 것 입니다.

3.6.8, 3.7.2 및 3.8.0 이전의 Python 버전까지는 Python 2 datetime객체 데이터의 피클 링 이 사용하지 않으면 중단 됩니다 encoding='bytes'.


답변

encoding='latin1'객체에 numpy 배열이 포함 된 경우 사용 하면 일부 문제가 발생합니다.

사용하는 encoding='bytes'것이 좋습니다.

사용에 대한 자세한 설명 은이 답변 을 참조하십시오encoding='bytes'


답변