আমি খালি ফাইলটি পড়ার কারণে কেন "পিকল - ইওফিউরার: ইনপুট ছাড়াই"?


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()ফাইলটি বিদ্যমান রয়েছে তা নিশ্চিত করার জন্য প্রথম লাইনটি এখানে রয়েছে
ম্যাগিক্স

উত্তর:


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()আপনার কোডটিতে কিছু করছে না এবং আপনাকে ব্যবহার করার দরকার নেই ;


ওপেন (টার্গেট, 'এ')। ফাইলটি বিদ্যমান রয়েছে তা নিশ্চিত করার জন্য ক্লোজ () এখানে রয়েছে ;-) + আমাকে ব্যবহার করার দরকার নেই ;তবে আমি কেবল সি থেকে এসেছি, এবং ;আমার লাইনের শেষে ব্যবহার না করে আমার কান্নার সৃষ্টি করে টিটি
ম্যাগিক্স

ঠিক আছে, তবে জারি করা অপ্রয়োজনীয় কারণ আমি কল্পনা করেছি যে আপনি কেবল ডিক বাছাই করছেন, খালি ফাইলের জন্য যাচাই করা যথেষ্ট হবে
প্যাডারিক কানিংহাম

তদুপরি, ফাইলটি পরীক্ষা করা খালি নয়, এর অর্থ এই নয় যে আমি এটি পাতলা করতে পারি ... একটি ব্যতিক্রম উত্থাপন ... এই কারণেই আমি মনে করি না যে আপনার উত্তরটি সবচেয়ে ভাল নয়, এমনকি এটি ভেবেও খারাপ নয়।
ম্যাগিক্স

2
একটি ধরা EOF exceptionআপনাকে অন্য সমস্ত সম্ভাব্য ত্রুটি থেকে বাঁচায় না।
প্যাডেরিক কানিংহাম

1
ওএস মডিউলটি ব্যবহার করেও কোনও ফাইল উপস্থিত রয়েছে কিনা তা আপনি পরীক্ষা করতে পারেন, প্রতিবার কোনও ফাইল খোলার এবং বন্ধ করার চেয়ে ভাল might
প্যাডেরিক কানিংহাম

131

এখানে বেশিরভাগ উত্তর কীভাবে ইওফেরার ব্যাতিক্রম পরিচালনা করতে পারে তা নিয়ে কাজ করেছে, যেটা যদি আপনি বাছাই করা বস্তুটি খালি কিনা তা সম্পর্কে অনিশ্চিত থাকেন তবে তা সত্যিই সহজ।

যাইহোক, আপনি যদি আশ্চর্য হন যে আচারের ফাইলটি খালি রয়েছে, কারণ আপনি 'ডাব্লুবি' বা অন্য কোনও মোডের মাধ্যমে ফাইলটির নামটি খুলতে পেরেছেন কারণ ফাইলটি ওভার-লিখিত থাকতে পারে।

উদাহরণ স্বরূপ:

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

এটি পিকযুক্ত ফাইলটি ওভার-লিখন করবে। ব্যবহারের আগে আপনি ভুল করে এটি করতে পারেন:

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

এবং তারপরে EOFError পেল কারণ কোডের পূর্ববর্তী ব্লকটি সিডি.পিপিএল ফাইলটি ওভার-লিখিত করেছিল।

জুপিটারে বা কনসোলে (স্পাইডার) কাজ করার সময় আমি সাধারণত পঠন / লেখার কোডের উপরে একটি মোড়ক লিখি, এবং পরে মোড়কটিকে কল করি। এটি সাধারণ পাঠ্য-লেখার ভুলগুলি এড়ায় এবং আপনি যদি ট্র্যাভেলগুলির মাধ্যমে একই ফাইলটি একাধিকবার পড়তে চলেছেন তবে কিছুটা সময় সাশ্রয় করে


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এটি আপনাকে +1
নেব

10
আমি সবেমাত্র এটি করেছি; সত্যিই এই নোটটির প্রশংসা করুন (আমি আনন্দিত যে আমি একমাত্র নই!)
zlipp

8
"ডাব্লু ডাব্লু" দিয়ে এর আগে এটি ওভাররাইট করে ফেলেছে। +1
gebbissimo

5
অনেক সময় সুস্পষ্টভাবে একেবারেই স্পষ্ট হয় না! ধন্যবাদ :)
jerpint

ফাইল লকিংয়ের প্রয়োজনীয়তা - এই উত্তরটি অনেক লোককে সহায়তা করবে, আমি যখন ফাইলটি লেখার জন্য উন্মুক্ত ছিল তখন এটি পড়ার চেষ্টা করছিলাম।
উচ্চাকাঙ্ক্ষী 1

8

আপনি দেখতে পাচ্ছেন যে এটি আসলে একটি প্রাকৃতিক ত্রুটি ..

আনপিক্লার অবজেক্ট থেকে পড়ার জন্য একটি সাধারণ কাঠামো এরকম হবে ..

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

EOFError কেবল উত্থাপিত হয়, কারণ এটি একটি খালি ফাইলটি পড়ছিল, এটি কেবল ফাইলের সমাপ্তি বোঝায় ..


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')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.