programing

python 3을 사용하여 python 2 개체 선택 취소

minimums 2023. 6. 7. 22:26
반응형

python 3을 사용하여 python 2 개체 선택 취소

파이썬 2.4에서 피클된 객체를 파이썬 3.4로 로드하는 방법이 있는지 궁금합니다.

저는 최신 정보를 얻기 위해 많은 양의 회사 레거시 코드를 2대 3으로 실행해 왔습니다.

이렇게 하면 파일을 실행할 때 다음 오류가 발생합니다.

  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순식간에dict유형의 키 및 값 포함str.

그래서 제 질문은: 원래 python 2.4로 피클된 객체를 python 3.4로 로드하는 방법이 있나요?

당신은 말해야 할 것입니다.pickle.load()데이터를 Python 3 문자열로 테스트하여 Python을 변환하는 방법 또는 당신은 말할 수 있습니다.pickle바이트로 남겨둘 수 있습니다.

기본적으로 모든 문자열 데이터를 ASCII로 디코딩하고 디코딩이 실패합니다.설명서를 참조하십시오.

선택적 키워드 인수는 fix_imports, encoding errors이며, 이는 Python 2에서 생성된 피클 스트림에 대한 호환성 지원을 제어하는 데 사용됩니다.fix_imports가 true이면 피클은 이전 Python 2 이름을 Python 3에서 사용된 새 이름에 매핑하려고 시도합니다.인코딩 오류는 Python 2에 의해 피킹된 8비트 문자열 인스턴스를 디코딩하는 방법을 피클에 알려줍니다. 이러한 인스턴스는 각각 'ASCII' 및 'strict'로 기본 설정됩니다.인코딩은 이러한 8비트 문자열 인스턴스를 바이트 개체로 읽기 위해 'bytes'가 될 수 있습니다.

인코딩 설정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 개체 데이터의 피킹 해제가 중단됩니다.encoding='bytes'.

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

사용.encoding='bytes'더 나을 것입니다.

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

언급URL : https://stackoverflow.com/questions/28218466/unpickling-a-python-2-object-with-python-3

반응형