[python] 빈 파일을 읽을 때 “Pickle-EOFError : Ran out of input”이 발생하는 이유는 무엇입니까?

를 사용하는 동안 흥미로운 오류가 발생합니다 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')