স্পষ্টত ফাইল বন্ধ করা কি গুরুত্বপূর্ণ?


149

পাইথনে, আপনি যদি কল না করেই কোনও ফাইল খুলেন close(), বা ফাইলটি বন্ধ করেন তবে try- finallyবা with"বিবৃতি ব্যবহার না করেন , এটি কি সমস্যা? বা পাইথন আবর্জনা-সংগ্রহের উপর নির্ভর করে সমস্ত ফাইল বন্ধ করার জন্য কোডিং অনুশীলন হিসাবে যথেষ্ট? উদাহরণস্বরূপ, যদি কেউ এটি করে:

for line in open("filename"):
    # ... do stuff ...

... এটি কি সমস্যা কারণ ফাইলটি কখনই বন্ধ করা যায় না এবং একটি ব্যতিক্রম ঘটতে পারে যা এটি বন্ধ হতে বাধা দেয়? বা forফাইলটি সুযোগের বাইরে চলে যাওয়ার কারণে এটি অবশ্যই বক্তব্যটির উপসংহারে বন্ধ হয়ে যাবে?


13
ফাইলটি ব্লকের শেষে স্কোপের বাইরে যায় নাfor । এর রেফারেন্স গণনা শূন্যে চলে যাবে, যার ফলে এটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে, তবে কেবল ফাংশন, ক্লাস এবং মডিউলগুলি পাইথনের স্কোপগুলি সংজ্ঞায়িত করে, অন্য যৌগিক বিবৃতি নয়।
agf

18
সমস্যা না হলে সমস্যা নেই। ওএস স্তরে, স্ক্রিপ্টটি খোলে যে কোনও ফাইল স্ক্রিপ্টটি বন্ধ হয়ে গেলে বন্ধ হয়ে যাবে, সুতরাং থ্রোওয়ে সরঞ্জাম স্ক্রিপ্টগুলিতে ফাইলগুলি বন্ধ করার বিষয়ে আপনার চিন্তা করার দরকার নেই। যাইহোক, প্রক্রিয়াগুলি তাদের যে পরিমাণ ওপেন ফাইল বজায় রাখতে পারে তার সীমাবদ্ধতা রয়েছে, তাই দীর্ঘকালীন বা জটিল স্ক্রিপ্টগুলিকে আরও সতর্কতার প্রয়োজন হতে পারে। যাইহোক, আপনার ফাইলগুলি বন্ধ করা ভাল অভ্যাস।
রাসেল বোরোগোভ

3
@agf: আপনি ঠিক বলেছেন যে ফাইলটি সুযোগের বাইরে চলে যায় না তবে এটি forব্লক এবং ফাংশন / শ্রেণি / মডিউলগুলির মধ্যে পার্থক্যের সাথে সম্পর্কিত নয় । এটি এর চেয়ে অনেক সহজ: বস্তুর স্কোপ নেই, কেবল নাম থাকে। এমন কোনও নাম নেই যা এই অবজেক্টটিকে বোঝায় তাই এখানে সুযোগে থাকার বা সুযোগের বাইরে যাওয়ার মতো কিছুই নেই।
সর্বোচ্চ

@ ম্যাক্স আমার মন্তব্য তার অনুমানটিকে সংশোধন করছে যে forলুপের সাথে যুক্ত হওয়ার সুযোগ রয়েছে এবং উল্লেখ করা হচ্ছে যে ফাইলটি সম্পূর্ণ ভিন্ন কারণে বন্ধ হয়ে যায়। পাইথনে কী স্কোপ রয়েছে তা এটি পায় না , কারণ এটি এখানে প্রাসঙ্গিক নয়।
agf

@ ম্যাক্সের মধ্যে একটি অন্তর্নিহিত রেফারেন্স লুপের জন্য এটিকে স্কুপ করা হয়েছে ... এটি শব্দার্থবিজ্ঞানের একটি যুক্তি
পিটার আর

উত্তর:


126

আপনার উদাহরণে দোভাষী বাইরে বের হওয়ার আগে ফাইলটি বন্ধ হওয়ার নিশ্চয়তা নেই। সিপথনের বর্তমান সংস্করণগুলিতে ফাইলটি লুপের শেষে বন্ধ হয়ে যাবে কারণ সিপিথন রেফারেন্স গণনাটিকে তার প্রাথমিক আবর্জনা সংগ্রহের প্রক্রিয়া হিসাবে ব্যবহার করে তবে এটি একটি বাস্তবায়নের বিশদ, ভাষার কোনও বৈশিষ্ট্য নয়। পাইথনের অন্যান্য বাস্তবায়নগুলি এইভাবে কাজ করার গ্যারান্টিযুক্ত নয়। উদাহরণস্বরূপ, আয়রন পাইথন, পাইপাই, এবং জাইথন ​​রেফারেন্স গণনা ব্যবহার করে না এবং লুপের শেষে ফাইলটি বন্ধ করবে না।

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

আপনার উদাহরণ ব্যবহারের জন্য:

with open("filename") as f:
     for line in f:
        # ... do stuff ...

8
ব্যবহার করে with open() as fপরে এটি সম্পন্ন করা হয় ফাইলটি বন্ধ করুন স্বয়ংক্রিয়ভাবে?
রোহন

24
@ রোহান হ্যাঁ, withবিবৃতিটি যে সামান্য জাদুটি সরবরাহ করে তা হ'ল তবে অবশ্যই এই যাদুটির কাজ করার জন্য অবজেক্টটির অবশ্যই বিশেষ পদ্ধতি থাকতে হবে __enter__এবং __exit__পরবর্তীকালে অবজেক্টটি closeএবং অন্য কোনও ক্লিনআপ স্টাফগুলি করতে হবে যা এখানে করা দরকার withবিবৃতিটির শেষ ...
কপারফিল্ড

1
এফওয়াইআই: এই উত্তরটি কেবল "কখন বন্ধ থাকবে" ব্যাখ্যা করে তবে "এটি যদি খোলা থাকে তবে" কী ব্যাখ্যা করে না। পরবর্তীগুলির জন্য, দয়া করে "যদি কোনও ফাইল খোলা থাকে তবে কী হবে?" এই উত্তরে অংশ ( Askubuntu.com
দ্য

তদুপরি, ফাইলগুলি বন্ধ না করার ফলে ফাইলের সামগ্রীগুলি সজ্জিত না হওয়ায় কেটে ফেলা ফাইল হতে পারে।
এরওয়ান লেগ্রান্ড

সুতরাং আমি যদি ফাইলটি বন্ধ না করি, প্রোগ্রামটি বন্ধ হয়ে যাওয়ার পরে আমি কী নিশ্চিতভাবে আমার স্মৃতি ফিরে পাব? নাকি আমাকে আসলে পুরো দোভাষীর বাইরে যেতে হবে?
প্রো কি

22

কিছু পাইথনগুলি ফাইলগুলি আর রেফারেন্স না করা হলে স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে, অন্যরা তা করবে না এবং পাইথন ইন্টারপ্রেটারটি প্রস্থান করার সময় ফাইলগুলি বন্ধ করা O / S এর উপর নির্ভর করবে।

এমনকি পাইথনগুলির জন্য যা আপনার জন্য ফাইলগুলি বন্ধ করে দেবে, সময়টির গ্যারান্টি নেই: এটি তাত্ক্ষণিকভাবে হতে পারে বা এটি কয়েক সেকেন্ড / মিনিট / ঘন্টা / দিন পরে হতে পারে।

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

নৈতিকতা: নিজের পরে পরিষ্কার করুন। :)


9
ফাইলগুলি সিপিথনে আর উল্লেখ করা না গেলে বন্ধ হয়ে যায়, তবে এটি কোনও ভাষা বৈশিষ্ট্য নয়। এটি যদি আপনি বেশ আনন্দের সাথে এটি নির্ভর করতে পারে।
পিটার গ্রাহাম

9

যদিও এই বিশেষ ক্ষেত্রে এই ধরনের নির্মাণগুলি ব্যবহার করা বেশ নিরাপদ তবে এই জাতীয় অনুশীলনকে সাধারণীকরণের জন্য কিছু সতর্কতা রয়েছে:

  • রান সম্ভবত ফাইল বর্ণনাকারীর বাইরে চলে যেতে পারে, যদিও এটি অসম্ভব, এর মতো কোনও বাগ শিকারের কথা কল্পনা করুন
  • আপনি কিছু সিস্টেমে বলা ফাইল মুছে ফেলতে পারবেন না, যেমন উইন 32
  • আপনি যদি সিপিথন ব্যতীত অন্য কিছু চালনা করেন তবে কখন আপনার জন্য ফাইল বন্ধ থাকবে তা আপনি জানেন না
  • আপনি যদি লিখিতভাবে বা পঠন-লিখনের মোডে ফাইলটি খোলেন, আপনি কখনই ডেটা ফ্লাশ করবেন তা জানেন না

3

ফাইলটি আবর্জনা সংগ্রহ করে, এবং তাই এটি বন্ধ হয়ে যায়। জিসি নির্ধারণ করে যে এটি কখন বন্ধ হবে, আপনি নয়। স্পষ্টতই, এটি প্রস্তাবিত অনুশীলন নয় কারণ আপনি ফাইলগুলি ব্যবহার শেষ করার সাথে সাথে ফাইলগুলি বন্ধ না করলে আপনি ওপেন ফাইল হ্যান্ডেল সীমাটি হিট করতে পারেন। যদি forআপনার সেই লুপের মধ্যেই , আপনি আরও ফাইল খুলুন এবং সেগুলি দীর্ঘায়িত রেখে দিন?


তবে যদি আপনি লুপের জন্য অন্য ফাইলগুলি ওপেন করেন, তবে আপনি যদি সেগুলির কোনও স্পষ্টভাবে বন্ধ করেন বা না করেন তবে এক সাথে একাধিক ফাইল খোলা থাকবে still আপনি কি বলছেন যে ফাইলটি সুযোগের বাইরে যাওয়ার সাথে সাথে আবশ্যকভাবে আবর্জনা সংগ্রহ করা হয়নি, সুতরাং স্পষ্টভাবে করা গেলে তা তাড়াতাড়ি বন্ধ হয়ে যাবে? যখন কোনও ব্যতিক্রম ঘটে (আপনি যখন / চেষ্টা-অবশেষে বনাম ব্যবহার না করে) তখন কী করবেন?
ব্যবহারকারী 553702

1
সিপিথনে, রেফারেন্স গণনা forবিবৃতি দেওয়ার পরে এটি সংগ্রহের কারণ ঘটায় - আপনাকে পরবর্তী আবর্জনা সংগ্রহের জন্য অপেক্ষা করতে হবে না।
agf

3

হাই যখন আপনি একই অজগর স্ক্রিপ্টে এটির বিষয়বস্তু ব্যবহার করতে যাচ্ছেন তখন আপনার ফাইলের বর্ণনাকারকটিকে বন্ধ করা খুব গুরুত্বপূর্ণ। আমি আজ নিজেই বুঝতে পারি এত দীর্ঘ হেক্টর ডিবাগিংয়ের পরে। কারণটি হ'ল বিষয়বস্তু সম্পাদনা / মুছে ফেলা / সংরক্ষণ করা হবে কেবলমাত্র আপনি যখন ফাইল বর্ণনাকারী ফাইল বন্ধ করেন এবং ফাইলগুলিতে পরিবর্তনগুলি প্রভাবিত হয়!

সুতরাং ধরুন আপনার যদি পরিস্থিতি তৈরি হয় যে আপনি একটি নতুন ফাইলে কন্টেন্ট লিখেছেন এবং তারপরে এফডি বন্ধ না করে আপনি সেই ফাইলটি ব্যবহার করছেন (এফডি নয়) যা অন্য শেল কমান্ডে পড়েছে যা এর বিষয়বস্তুটি পড়ে reads এই পরিস্থিতিতে আপনি শেল কমান্ডের প্রত্যাশা অনুযায়ী সামগ্রী পাবেন না এবং আপনি যদি ডিবাগ করার চেষ্টা করেন তবে সহজেই বাগটি খুঁজে পেতে পারেন না। আপনার কাছে আমার ব্লগ এন্ট্রি আরও পড়তে পারেন http://magnificentzps.blogspot.in/2014/04/importance-of-closing-file-descriptor.html


1

আই / ও প্রক্রিয়া চলাকালীন, ডেটা বাফার করা হয়: এর অর্থ এটি ফাইলটিতে লিখিত হওয়ার আগে এটি একটি অস্থায়ী স্থানে রাখা হয়।

পাইথন বাফারটি ফ্লাশ করে না - এটি আপনার লেখার কাজটি শেষ না হওয়া অবধি ফাইলটিতে ডেটা লিখুন। এটি করার একটি উপায় ফাইলটি বন্ধ করা।

আপনি যদি কোনও ফাইল বন্ধ না করে লিখেন তবে ডেটা লক্ষ্য ফাইলে এটি তৈরি করবে না।

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