를 사용하는 동안 흥미로운 오류가 발생합니다 Unpickler.load()
. 다음은 소스 코드입니다.
open(target, 'a').close()
scores = {};
with open(target, "rb") as file:
unpickler = pickle.Unpickler(file);
scores = unpickler.load();
if not isinstance(scores, dict):
scores = {};
다음은 역 추적입니다.
Traceback (most recent call last):
File "G:\python\pendu\user_test.py", line 3, in <module>:
save_user_points("Magix", 30);
File "G:\python\pendu\user.py", line 22, in save_user_points:
scores = unpickler.load();
EOFError: Ran out of input
읽으려는 파일이 비어 있습니다. 이 오류가 발생하지 않고 대신 빈 변수를 얻을 수있는 방법은 무엇입니까?
답변
먼저 파일이 비어 있지 않은지 확인합니다.
import os
scores = {} # scores is an empty dict already
if os.path.getsize(target) > 0:
with open(target, "rb") as f:
unpickler = pickle.Unpickler(f)
# if file is not empty scores will be equal
# to the value unpickled
scores = unpickler.load()
또한 open(target, 'a').close()
코드에서 아무것도하지 않으며 ;
.
답변
여기에있는 대부분의 답변은 EOFError 예외를 관리하는 방법을 다루었습니다. 피클 된 객체가 비어 있는지 여부가 확실하지 않은 경우 정말 편리합니다.
그러나 피클 파일이 비어 있다는 사실에 놀란다면 ‘wb’또는 파일을 덮어 쓸 수있는 다른 모드를 통해 파일 이름을 열었 기 때문일 수 있습니다.
예를 들면 :
filename = 'cd.pkl'
with open(filename, 'wb') as f:
classification_dict = pickle.load(f)
절인 파일을 덮어 씁니다. 다음을 사용하기 전에 실수로이 작업을 수행했을 수 있습니다.
...
open(filename, 'rb') as f:
그리고 이전 코드 블록이 cd.pkl 파일을 덮어 썼기 때문에 EOFError가 발생했습니다.
Jupyter 또는 콘솔 (Spyder)에서 작업 할 때 일반적으로 읽기 / 쓰기 코드 위에 래퍼를 작성하고 나중에 래퍼를 호출합니다. 이렇게하면 일반적인 읽기-쓰기 실수를 피할 수 있으며 고생을 통해 동일한 파일을 여러 번 읽을 경우 시간을 절약 할 수 있습니다.
답변
보시다시피 그것은 실제로 자연스러운 오류입니다 ..
Unpickler 객체에서 읽기위한 일반적인 구조는 다음과 같습니다.
try:
data = unpickler.load()
except EOFError:
data = list() # or whatever you want
참고 EOFError는 단순히 발생이 빈 파일을 읽기 때문에, 그것은 단지 의미가 파일의 끝을 …
답변
절인 파일이 비어있을 가능성이 큽니다.
코드를 복사하여 붙여 넣는 경우 피클 파일을 덮어 쓰는 것은 놀랍도록 쉽습니다.
예를 들어 다음은 피클 파일을 작성합니다.
pickle.dump(df,open('df.p','wb'))
이 코드를 복사하여 다시 열었지만 변경 'wb'
하는 것을 잊은 'rb'
경우 파일을 덮어 쓰게됩니다.
df=pickle.load(open('df.p','rb'))
올바른 구문은 다음과 같습니다.
df=pickle.load(open('df.p','wb'))
답변
if path.exists(Score_file):
try :
with open(Score_file , "rb") as prev_Scr:
return Unpickler(prev_Scr).load()
except EOFError :
return dict()
답변
해당 예외를 포착하고 거기에서 원하는 것을 반환 할 수 있습니다.
open(target, 'a').close()
scores = {};
try:
with open(target, "rb") as file:
unpickler = pickle.Unpickler(file);
scores = unpickler.load();
if not isinstance(scores, dict):
scores = {};
except EOFError:
return {}
답변
파일을 여는 모드가 ‘a’이거나 다른 일부가 알파벳 ‘a’를 가지고 있으면 덮어 쓰기 때문에 오류가 발생합니다.
pointer = open('makeaafile.txt', 'ab+')
tes = pickle.load(pointer, encoding='utf-8')