ValueError: 지원되지 않는 Pickle 프로토콜: Python에서 3
- Python에서 피클링 및 피클링 해제
-
Python에서
ValueError: 지원되지 않는 피클 프로토콜: 3
의 원인 -
Python에서
ValueError: unsupported pickle protocol: 3
수정
모든 프로그래밍 언어에는 많은 오류가 발생합니다. 일부는 컴파일 타임에, 일부는 런타임에 발생합니다.
이 기사에서는 ValueError: 지원되지 않는 피클 프로토콜: 3
에 대해 설명합니다.
Python에서 피클링 및 피클링 해제
Pickling
은 파이썬 객체(list
, dict
등)를 문자 스트림으로 바꾸는 방법입니다. 이 문자 스트림은 ‘Unpickling’이라는 역 프로세스를 사용하여 다른 Python 스크립트에서 객체를 재생성하는 데 필요한 모든 데이터를 포함해야 합니다.
pickle
모듈은 Python에서 피클링 및 피클링 해제를 수행합니다.
다음 코드에서는 목록을 피클 및 피클 해제했습니다. 이름 목록을 만들고 wb
모드를 사용하여 파일을 열었습니다.
w
는 아직 존재하지 않는 경우 파일을 생성하고 b
는 데이터(목록)를 바이트 스트림으로 파일에 기록합니다. 덤프할 목록과 데이터를 바이트 형식으로 쓸 파일 이름을 지정하는 dump()
메서드를 호출했습니다.
마찬가지로 rb
모드의 파일에서 먼저 데이터를 읽어서 데이터를 언피클링했습니다. load()
메서드를 사용하여 파일에서 바이트를 읽고 다시 목록 객체로 변환했습니다.
예제 코드:
# Python 3.x
import pickle
my_list = ["Jhon", "Alia", "Sam", "Chris"]
with open("my_file.txt", "wb") as f:
pickle.dump(my_list, f)
my_file = open("my_file.txt", "rb")
data = pickle.load(my_file)
print(data)
출력(Anaconda의 Jupyter 노트북에서 실행):
Python에서 ValueError: 지원되지 않는 피클 프로토콜: 3
의 원인
때로는 unpickling 과정에서 ValueError: unsupported pickle protocol: 3
에 직면합니다. 이는 데이터 피클링 및 역피클링 중에 사용되는 호환되지 않는 피클 프로토콜 때문입니다.
Python 3은 프로토콜을 지정하지 않은 경우 데이터를 피클 및 피클 해제하기 위해 기본적으로 프로토콜 3을 도입하고 사용했습니다. 서로 다른 프로토콜을 사용하여 데이터를 피클 및 언피클하면 아래 코드와 같이 이 오류가 발생합니다.
Python 2는 기본적으로 프로토콜 0을 사용했고 Python 3은 프로토콜 3을 사용했습니다. 따라서 이 오류는 프로토콜 버전을 올바르게 지정하지 않고 다른 Python 버전에서 데이터를 피클 및 역피클할 때 주로 발생합니다.
예제 코드:
파이썬 3:
# Python 3.x
import pickle
my_list = ["Jhon", "Alia", "Sam", "Chris"]
with open("my_file.txt", "wb") as f:
pickle.dump(my_list, f)
파이썬 2:
# Python 2.x
import pickle
my_file = open("my_file.txt", "rb")
data = pickle.load(my_file)
print(data)
출력:
Python에서 ValueError: unsupported pickle protocol: 3
수정
이 오류를 해결하려면 Python 2에서 이 데이터를 로드하기 위해 Python 3을 사용하여 데이터를 덤프할 때 3
보다 작은 pickle 프로토콜을 지정해야 합니다. Python 2는 2보다 큰 프로토콜을 지원하지 않기 때문입니다.
예제 코드:
# Python 3.x
import pickle
my_list = ["Jhon", "Alia", "Sam", "Chris"]
with open("my_file.txt", "wb") as f:
pickle.dump(my_list, f, protocol=2)
예제 코드:
# Python 2.x
import pickle
my_file = open("my_file.txt", "rb")
data = pickle.load(my_file)
print(data)
출력:
여기서 문자열 앞의 u
는 유니코드를 나타냅니다.
I am Fariba Laiq from Pakistan. An android app developer, technical content writer, and coding instructor. Writing has always been one of my passions. I love to learn, implement and convey my knowledge to others.
LinkedIn관련 문장 - Python Error
- AttributeError 수정: Python에서 'generator' 객체에 'next' 속성이 없습니다.
- AttributeError 해결: 'list' 객체 속성 'append'는 읽기 전용입니다.
- AttributeError 해결: Python에서 'Nonetype' 객체에 'Group' 속성이 없습니다.
- AttributeError: 'Dict' 객체에 Python의 'Append' 속성이 없습니다.
- AttributeError: 'NoneType' 객체에 Python의 'Text' 속성이 없습니다.
- AttributeError: Int 객체에 속성이 없습니다.