मुझे एक खाली फाइल पढ़ने के लिए "अचार - ईफ्रोर: रन आउट ऑफ इनपुट" क्यों मिलता है?


109

मुझे उपयोग करने का प्रयास करते समय एक दिलचस्प त्रुटि मिल रही है 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

मैं जिस फाइल को पढ़ने की कोशिश कर रहा हूं वह खाली है। मैं इस त्रुटि को प्राप्त करने से कैसे बच सकता हूं, और इसके बजाय एक खाली चर प्राप्त कर सकता हूं?


फ़ाइल को बंद न करें
अलकेश महाजन

पहली पंक्ति open(...).close()यह सुनिश्चित करने के लिए है कि फ़ाइल मौजूद है
Magix

जवाबों:


126

मैं जाँच करूँगा कि फ़ाइल पहले खाली नहीं है:

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()अपने कोड में कुछ भी नहीं कर रहा है और आप का उपयोग करने की जरूरत नहीं ;


खुले (लक्ष्य, 'ए')। क्लोज़ () यह सुनिश्चित करने के लिए है कि फ़ाइल मौजूद है;; + + मुझे उपयोग करने की आवश्यकता नहीं है ;लेकिन मैं अभी C से आया हूं, और ;मेरी पंक्तियों के अंत में उपयोग नहीं कर रहा हूँ TT
मैगिक्स जूल

ठीक है, लेकिन आइंस्टीन अनावश्यक है जैसा कि मैं कल्पना करता हूं कि आप केवल एक तानाशाह का चयन करने जा रहे हैं, एक खाली फाइल की जांच करना पर्याप्त होगा
Padraic Cunningham

इसके अलावा, फ़ाइल की जाँच करना खाली नहीं है, इसका मतलब हमेशा यह नहीं होगा कि मैं इसे अनपैक कर सकता हूं ... एक अपवाद बढ़ा रहा हूं ... इसलिए मुझे नहीं लगता कि आपका उत्तर सबसे अच्छा नहीं है, यहां तक ​​कि यह भी बुरा नहीं है।
मैजिक

2
एक पकड़ने EOF exceptionसे आप अन्य सभी संभावित त्रुटियों से नहीं बचेंगे।
पडेरिक कनिंघम

1
यदि आप ओएस मॉड्यूल का उपयोग करके एक फ़ाइल मौजूद है, तो आप हर बार फ़ाइल खोलने और बंद करने से बेहतर हो सकते हैं।
पादरी कनिंघम

131

यहां अधिकांश उत्तर ईओफ्रायर अपवादों का सामना करने के तरीके से निपटा गया है, जो वास्तव में आसान है कि क्या आप इस बारे में अनिश्चित हैं कि क्या चुना गया वस्तु खाली है या नहीं।

हालाँकि, यदि आप हैरान हैं कि अचार फ़ाइल खाली है, तो ऐसा इसलिए हो सकता है क्योंकि आपने फ़ाइल नाम 'wb' या किसी अन्य मोड के माध्यम से खोला है जो फ़ाइल को ओवर-राइट कर सकता था।

उदाहरण के लिए:

filename = 'cd.pkl'
with open(filename, 'wb') as f:
    classification_dict = pickle.load(f)

यह पिक फाइल को ओवर-राइट कर देगा। आपने इसे उपयोग करने से पहले गलती से किया होगा:

...
open(filename, 'rb') as f:

और फिर EOFError मिली क्योंकि कोड के पिछले ब्लॉक ने cd.pkl फाइल को ओवर-राइट कर दिया था।

जुपिटर में काम करते समय, या कंसोल (स्पाइडर) में, मैं आमतौर पर रीडिंग / राइटिंग कोड पर एक आवरण लिखता हूं, और बाद में आवरण को कॉल करता हूं। यह सामान्य पढ़ने-लिखने की गलतियों से बचा जाता है, और यदि आप एक ही फ़ाइल को कई बार अपने ट्रैवेल्स के माध्यम से पढ़ रहे हैं तो थोड़ा समय बचाता है


43
However, if you're surprised that the pickle file is empty, it could be because you opened the filename through 'wb' or some other mode that could have over-written the fileइसने आपको
Neb

10
मैंने बस यही किया; वास्तव में इस नोट की सराहना करते हैं (मुझे खुशी है कि मैं अकेला नहीं हूँ!)
zlipp

8
"wb" के साथ इसे पहले भी अधिलेखित कर दिया है। +1
gebbissimo 14

5
कभी-कभी स्पष्ट बिल्कुल स्पष्ट नहीं होता है! धन्यवाद :)
मरुत

फ़ाइल लॉकिंग आवश्यकता - यह उत्तर कई लोगों को मदद करेगा, मैं फ़ाइल को पढ़ने के लिए कोशिश कर रहा था, जबकि यह लिखने के लिए खुला था।
आकांक्षा 1

8

जैसा कि आप देखते हैं, यह वास्तव में एक प्राकृतिक त्रुटि है।

एक Unpickler ऑब्जेक्ट से पढ़ने के लिए एक विशिष्ट निर्माण इस तरह होगा ..

try:
    data = unpickler.load()
except EOFError:
    data = list()  # or whatever you want

EOFError को केवल इसलिए उठाया जाता है, क्योंकि यह एक खाली फाइल पढ़ रहा था, इसका मतलब सिर्फ End of File था


7

यह बहुत संभावना है कि चुना फाइल खाली है।

यदि आप कोड को कॉपी और पेस्ट कर रहे हैं तो अचार फ़ाइल को अधिलेखित करना आश्चर्यजनक रूप से आसान है।

उदाहरण के लिए निम्नलिखित अचार फ़ाइल लिखते हैं:

pickle.dump(df,open('df.p','wb'))

और इसे फिर से खोलने के लिए इस कोड की नकल की है, लेकिन परिवर्तन करना भूल गया है, तो 'wb'करने के लिए 'rb'तो आप फ़ाइल को अधिलेखित होगा:

df=pickle.load(open('df.p','rb'))

सही सिंटैक्स है

df=pickle.load(open('df.p','wb'))

3
if path.exists(Score_file):
      try : 
         with open(Score_file , "rb") as prev_Scr:

            return Unpickler(prev_Scr).load()

    except EOFError : 

        return dict() 

2
हेलो और स्टैकओवरफ्लो में आपका स्वागत है। क्या आप इस कोड को थोड़ा स्पष्ट कर सकते हैं?
अलेक्जेंडर

2

आप उस अपवाद को पकड़ सकते हैं और वहां से जो चाहें वापस कर सकते हैं।

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 {}

10
इसके साथ समस्या यह है कि यह चुपचाप भ्रष्ट फ़ाइलों को छिपाने के लिए जा रहा है।
रॉस रिज

0

ध्यान दें कि फ़ाइलों को खोलने का मोड 'ए' है या कुछ अन्य में वर्णमाला है 'ए' भी ओवरराइटिंग के कारण त्रुटि करेगा।

pointer = open('makeaafile.txt', 'ab+')
tes = pickle.load(pointer, encoding='utf-8')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.