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)
경쟁에 절인 객체를 보면, 그것은있어 dict
A의 dict
유형의 키와 값을 포함 str
.
그래서 내 질문은 : 파이썬 3.4에서 원래 python 2.4에서 절인 객체를로드하는 방법이 있습니까?
답변
pickle.load()
파이썬 pickle
바이트 문자열 데이터를 파이썬 3 문자열로 변환하는 방법 을 알려주 거나 바이트로 남겨 둘 수 있습니다.
기본값은 모든 문자열 데이터를 ASCII로 시도하고 디코딩하는 것이며 해당 디코딩에 실패합니다. pickle.load()
설명서를 참조하십시오 :
선택적 키워드 인수는 fix_imports , encoding 및 errors 이며, 이는 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'