점프투파이썬 Python 3으로 Python 2 객체 언 클링



파이썬 엔터입력 (2)

인코딩 = 'latin1'을 사용하면 객체에 numpy 배열이 포함되어있을 때 일부 문제가 발생합니다.

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

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

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)

경합에서 절인 객체를 보면 str 유형의 키와 값을 포함하는 dictdict 입니다.

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


Answer #1

파이썬 바이트 열 데이터를 파이썬 3 문자열로 변환하는 방법을 pickle.load() 에게 알려 pickle.load() pickle 에게 바이트로 남겨 두라고 지시 할 수 있습니다.

기본값은 모든 문자열 데이터를 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 키와 값을 디코딩하는 것입니다.

encoding='bytes' 를 사용하지 않으면 3.6.8, 3.7.2 및 3.8.0 이전의 Python 버전까지 Python 2 datetime 오브젝트 데이터의 피클 링 해제가 중단 됩니다.





python-2to3