পাইথন - ফাইল বনাম খোলা কখন ব্যবহার করবেন


138

পাইথনের মধ্যে fileএবং পার্থক্য কী open? আমি কখন কোনটি ব্যবহার করব? (বলুন আমি 2.5 এ আছি)

উত্তর:


153

আপনার সর্বদা ব্যবহার করা উচিত open()

নথি হিসাবে বলা হয়েছে:

কোনও ফাইল খোলার সময় এই নির্মাতাকে সরাসরি অনুরোধ করার পরিবর্তে ওপেন () ব্যবহার করা ভাল rable ফাইল টাইপ টেস্টিংয়ের জন্য বেশি উপযুক্ত (উদাহরণস্বরূপ, "isinstance (f, file)" লেখার জন্য)।

এছাড়াও, পাইথন 3.0 এর পরে file() থেকে সরানো হয়েছে


23
এটি ব্যাঘাতকর, যেহেতু ডকুমেন্টেশনটি বলেছিল "পাইথন ২.২ এ ফাইল () কনস্ট্রাক্টর নতুন। যেহেতু আমি দশ বছর আগে আরটিএফএম করার সিদ্ধান্ত নিয়েছি এবং প্রকার এবং শ্রেণীর একীকরণের খুব পছন্দ হয়েছি তাই আমি আর কখনও খোলা () ব্যবহার করিনি। তদুপরি, আমি এখনও অনুভব করি যে টাইপ কনস্ট্রাক্টর হ'ল পাথ আরগের দ্বারা অবস্থিত, এবং মোড আরগের অনুরোধ অনুসারে আচরণ করা অবজেক্টের মতো কোনও ফাইল ফেরত দেওয়ার আরও সুস্পষ্ট উপায়। আমি বিশেষত এইভাবে অনুভব করি যখন তখন devs এর সুস্পষ্ট অভিপ্রায়টি তখন 2 ওপেন 4 কমপ্যাট ধরে রাখে।
umeboshi

32

দুটি কারণ: "এটি করার এক উপায় থাকা উচিত" এর অজগর দর্শন এবং fileচলে যাচ্ছে।

fileআসল প্রকার (যেমন ব্যবহার করে file('myfile.txt')এটির কনস্ট্রাক্টরকে কল করা হচ্ছে)। openএকটি ফ্যাক্টরি ফাংশন যা কোনও ফাইলের অবজেক্ট ফিরিয়ে দেবে।

পাইথন ৩.০ লাইব্রেরিতে fileএকাধিক ক্লাস দ্বারা বিল্ট-ইন হয়ে বাস্তবায়িত হতে চলেছে io(বাফার পাঠকদের সাথে জাভা এর মতো কিছুটা ইত্যাদি)


3
কী কারণে দুটো কারণ?
ম্যাট

19

file()ইনট বা তালিকার মতো একটি প্রকার। open()ফাইল খোলার জন্য একটি ফাংশন, এবং একটি fileবস্তু ফিরে আসবে ।

এটি কখন খোলা ব্যবহার করা উচিত তার একটি উদাহরণ:

f = open(filename, 'r')
for line in f:
    process(line)
f.close()

আপনার কখন ফাইল ব্যবহার করা উচিত এটি এর একটি উদাহরণ:

class LoggingFile(file):
    def write(self, data):
        sys.stderr.write("Wrote %d bytes\n" % len(data))
        super(LoggingFile, self).write(data)

যেমন আপনি দেখতে পাচ্ছেন, উভয়ের বিদ্যমান থাকার জন্য একটি ভাল কারণ এবং উভয়ের জন্য একটি স্পষ্ট ব্যবহারের ক্ষেত্রে।


5
সাধারণত, ফাইলগুলি withবিবৃতি দিয়ে খোলা উচিত । with open(filename, 'r') as f: \ for line in f: \ process(line)। এটি সুস্পষ্ট কাছাকাছি এড়ানো। পাইথন ২.6 এবং তারপরে স্থানীয়ভাবে withবিবৃতিটিকে সমর্থন করে । পাইথন 2.5 তে, আপনাকে অবশ্যই from __future__ import with_statementআপনার কোডের শীর্ষে যুক্ত করতে হবে ।
আইসআর্ডার

আপনি কি দ্বিতীয় উদাহরণটিতে অন্তর্নির্মিত নামটিকে নতুনভাবে সংজ্ঞা দিয়েছিলেন?

1
@ প্ল্যানেটপ, দ্বিতীয় উদাহরণটি কেবল ফাইল শ্রেণীর উত্তরাধিকার সূত্রে প্রাপ্ত। আমি মনে করি এটি অদ্ভুত যে এটি নিম্নতর ক্ষেত্রে রয়েছে, তবে এটি মূল বিল্টিন ধরণের (যেমন বস্তু,
স্ট্রিং

1
পাইথন 2.5 তে, fileক্লাসটি বিশেষ পদ্ধতিতে সজ্জিত ছিল যা যখনই কোনও withবিবৃতি দিয়ে কোনও ফাইল খোলা হয় তখন স্বয়ংক্রিয়ভাবে কল হয় । এই বিশেষ পদ্ধতিগুলি নিশ্চিত করে যে ফাইলটি সঠিকভাবে এবং নিরাপদে খোলা এবং বন্ধ রয়েছে।
Mausy5043

7

কার্যকরীভাবে, দুটি একই; যাইহোক openকল করবে file, সুতরাং বর্তমানে পার্থক্য শৈলী একটি বিষয়। পাইথন ডক্স ব্যবহার করার প্রস্তাব open

কোনও ফাইল খোলার সময়, সরাসরি ফাইল নির্মাণকারীকে সরাসরি অনুরোধ করার পরিবর্তে ওপেন () ব্যবহার করা ভাল pre

কারণটি হ'ল ভবিষ্যতের সংস্করণগুলিতে এগুলি একই হওয়ার নিশ্চয়তা নেই (এটি openএকটি কারখানার কার্যক্রমে পরিণত হবে, এটি যে পথটি খোলার পথে তার উপর নির্ভর করে বিভিন্ন ধরণের জিনিস ফেরত দেয়)।


2
ওপেন ইতিমধ্যে একটি কারখানার ফাংশন, তাই কার্যকরী পার্থক্য রয়েছে (যেমন: উত্তরাধিকার, ইসিনস্ট্যান্স () ইত্যাদি)
ব্রায়ান

4

ফাইল খোলার জন্য কেবল কখনও ওপেন () ব্যবহার করুন। ফাইল () প্রকৃতপক্ষে 3.0 এ সরানো হচ্ছে এবং এই মুহুর্তে এটি হ্রাস পেয়েছে। তাদের মধ্যে এক ধরণের অদ্ভুত সম্পর্ক রয়েছে তবে ফাইল () এখন চলছে, সুতরাং আর চিন্তার দরকার নেই।

নীচে পাইথন 2.6 ডক্স থেকে প্রাপ্ত। [বন্ধনী স্টাফ] আমার দ্বারা যুক্ত।

কোনও ফাইল খোলার সময়, এই [ফাইল ()] কনস্ট্রাক্টরকে সরাসরি অনুরোধ করার পরিবর্তে ওপেন () ব্যবহার করা ভাল। ফাইল টাইপ টেস্টিংয়ের জন্য আরও উপযুক্ত (উদাহরণস্বরূপ, লেখার বিস্তৃতি (চ, ফাইল)


2

মিঃ ভ্যান রসমের মতে, যদিও ওপেন () বর্তমানে ফাইলের জন্য একটি উপন্যাস () আপনার ওপেন () ব্যবহার করা উচিত কারণ এটি ভবিষ্যতে পরিবর্তিত হতে পারে।

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