পাইথন দিয়ে ফাইল পড়া

ভূমিকা

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

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

পাইথনে ফাইলের বেসিক

ফাইল দিয়ে কাজ করার সাধারণ পদ্ধতি হল open() একটি ফাইল খুলতে, seek() প্রদত্ত অফসেটে ফাইলের বর্তমান অবস্থান সেট করতে, এবং close() আপনি এটি ব্যবহার করা শেষ হলে ফাইল অবজেক্ট বন্ধ করতে। অন্তর্নির্মিত open() ফাংশন একটি ফাইল হ্যান্ডেল প্রদান করে যা একটি ফাইল অবজেক্টের প্রতিনিধিত্ব করে যা ফাইলটি পড়ার, লেখার বা যুক্ত করার জন্য অ্যাক্সেস করতে ব্যবহার করা হবে।

পড়ার জন্য একটি ফাইল খোলার সময়, পাইথনকে ঠিক কীভাবে ফাইলটি সিস্টেমের সাথে খুলতে হবে তা জানতে হবে। দুটি অ্যাক্সেস মোড উপলব্ধ - বাইনারি মোডে পড়া এবং পড়া। ব্যবহৃত নিজ নিজ পতাকা হয় 'r', এবং 'rb', এবং বিল্ট-ইন দিয়ে একটি ফাইল খোলার সময় নির্দিষ্ট করতে হবে open() ফাংশন প্রথম মোডে বিশেষ অক্ষরের ব্যাখ্যা রয়েছে যেমন "CR" (ক্যারেজ রিটার্ন) এবং "LF" (লাইনফিড) লাইন ব্রেকগুলি উপস্থাপন করার জন্য, যেখানে বাইনারি মোড আপনাকে কাঁচা মোডে ডেটা পড়ার অনুমতি দেয় - যেখানে ডেটা যেমন সংরক্ষণ করা হয় আরও ব্যাখ্যা ছাড়াই।

একবার আপনি একটি ফাইল খুললে, open() ফাংশন আপনাকে একটি ফাইল অবজেক্ট ফিরিয়ে দেবে। এই ফাইল বস্তুর মত পদ্ধতি আছে read(), readline(), write(), tell(), এবং seek(). যদিও কিছু ফাইল অবজেক্টের (বা ফাইলের মতো অবজেক্ট) এখানে তালিকাভুক্ত পদ্ধতির চেয়ে বেশি পদ্ধতি রয়েছে, এইগুলি সবচেয়ে সাধারণ। সমস্ত ফাইল অবজেক্টের সমস্ত ফাইল পদ্ধতি প্রয়োগ করার দরকার নেই।

একটি ফাইল লাইন-বাই-লাইন পড়া

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

এখানে ব্যবহার করা হয় a while লুপ যেটা একটানা ফাইল থেকে যতক্ষণ পর্যন্ত পড়া হয় readline() পদ্ধতি ডেটা ফেরত রাখে। যদি ফাইলের শেষ (EOF) পৌঁছে যায় while লুপ বন্ধ হয়ে যায় এবং ফাইল অবজেক্ট বন্ধ হয়ে যায়, অন্যান্য প্রোগ্রাম ব্যবহারের জন্য রিসোর্স মুক্ত করে:


filename = "test.txt"

filehandle = open(filename, 'r')
while True:
    
    line = filehandle.readline()
    if not line:
        break
    print(line)


filehandle.close()

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

একটি উন্নতি হিসাবে, সুবিধাজনক পুনরাবৃত্তিকারী প্রোটোকল Python 2.3-এ চালু করা হয়েছিল। এটি আপনাকে সরলীকরণ করতে দেয় readline লুপ:


filename = "test.txt"
for line in open(filename, 'r'):
    print(line)

এখানে ব্যবহার করা হয় a for সঙ্গে সমন্বয় লুপ in পুনরাবৃত্তিকারী এর সাহায্যে বর্তমান রেখা চিহ্নিত করা হয় in iterator, ফাইল থেকে পড়া, এবং এর বিষয়বস্তু আউটপুট হয় stdout. পাইথন আপনার জন্য ফাইলের খোলার এবং বন্ধ করার বিষয়টি কভার করে যখন এটি সুযোগের বাইরে পড়ে। অদক্ষ থাকাকালীন, এটি আপনাকে আর ফাইল হ্যান্ডেলগুলির সাথে মোকাবিলা করতে দেয় না।

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

পাইথন 2.5-এ প্রবর্তিত হয়েছে with কমান্ড পুরো প্রক্রিয়াটিকে আরও বেশি করে এনক্যাপসুলেট করে, এবং স্কোপড কোড ব্লক জুড়ে একবার ফাইল খোলা এবং বন্ধ করাও পরিচালনা করে:


filename = "test.txt"
with open(filename, 'r') as filehandle:
    for line in filehandle:
        print(line)

এর সংমিশ্রণ with বিবৃতি এবং open() কমান্ড শুধুমাত্র একবার ফাইল খোলে। সফল হলে for লুপ চালানো হয়, এবং লাইনের বিষয়বস্তু মুদ্রিত হয় stdout.

উপরন্তু, এর ব্যবহার with বিবৃতি একটি পার্শ্ব প্রতিক্রিয়া আছে. অভ্যন্তরীণভাবে, পাইথন দোভাষী একটি তৈরি করে try-finallyফাইল থেকে পড়া এনক্যাপসুলেট করতে ব্লক করুন। নিম্নলিখিত উদাহরণটি দেখায় যে পাইথনের সাথে অভ্যন্তরীণভাবে কী ঘটছে with কোড ব্লক:

try:
    filehandle = open(filename, 'r')
    
finally:
    filehandle.close()

লাইনের অংশ হিসাবে একটি ফাইল পড়া

এখন পর্যন্ত, আমরা লাইন দ্বারা একটি ফাইল প্রক্রিয়া করেছি। এটি বিশাল ফাইলগুলির জন্য বরং ধীর এবং একই সময়ে একাধিক লাইন পড়ার দ্বারা উন্নত করা যেতে পারে। যে অর্জন করতে, islice() থেকে পদ্ধতি itertools মডিউল খেলার মধ্যে আসে। এছাড়াও, এটি একটি পুনরাবৃত্তিকারী হিসাবে কাজ করে এবং ডেটার একটি অংশ প্রদান করে যা নিয়ে গঠিত n লাইন ফাইলের শেষে, ফলাফলটি ছোট হতে পারে, এবং অবশেষে, কলটি একটি খালি তালিকা ফিরিয়ে দেবে:

from itertools import islice

filename = "test.txt"

number_of_lines = 5

with open(filename, 'r') as input_file:
    lines_cache = islice(input_file, number_of_lines)
   
    for current_line in lines_cache:
        print (current_line)

একটি ফাইল থেকে একটি নির্দিষ্ট লাইন পড়া

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


filename = "test.txt"

line_number = 3
print (f"line {line_number} of {filename} is: ")

with open(filename, 'r') as filehandle:
current_line = 1
    for line in filehandle:
        if current_line == line_number:
            print(line)
            break
        current_line += 1

এটি বোঝা সহজ হওয়া উচিত, তবে এটি আগের উদাহরণগুলির চেয়ে কিছুটা দীর্ঘ। এটি ব্যবহার করে ছোট করা যেতে পারে লাইনক্যাশে মডিউল।

নিচের উদাহরণে দেখানো হয়েছে কিভাবে ব্যবহার করে কোড সহজ করা যায় getline() পদ্ধতি যদি অনুরোধ করা লাইন নম্বরটি ফাইলের বৈধ লাইনের সীমার বাইরে পড়ে, তাহলে getline() পদ্ধতি পরিবর্তে একটি খালি স্ট্রিং প্রদান করে:


import linecache

filename = "test.txt"

line_number = 3

line = linecache.getline(filename, line_number)
print (f"line {line_number} of {filename}:")
print (line)

একবারে পুরো ফাইল পড়া

শেষ কিন্তু অন্তত নয়, আমরা আগের উদাহরণের চেয়ে খুব আলাদা একটি কেস দেখতে পাব – একবারে একটি সম্পূর্ণ ফাইল পড়া।

মনে রাখবেন যে বেশিরভাগ ক্ষেত্রে পুরো ফাইলটি পড়ার জন্য আপনার যথেষ্ট মেমরি থাকা উচিত, যেহেতু অক্ষরগুলি খুব বেশি জায়গা নেয় না, তবে বড় ফাইলগুলির জন্য ক্লান্ত হয়ে পড়ে। নিম্নলিখিত উদাহরণ একটি সমন্বয় ব্যবহার করে with বিবৃতি, এবং read() পদ্ধতি এই ক্ষেত্রে, আমরা ব্যবহার করব read() ডাটা স্ট্রিম হিসাবে ফাইল সামগ্রী লোড করতে:

সেরা-অভ্যাস, শিল্প-স্বীকৃত মান এবং অন্তর্ভুক্ত চিট শীট সহ গিট শেখার জন্য আমাদের হ্যান্ডস-অন, ব্যবহারিক গাইড দেখুন। গুগলিং গিট কমান্ড এবং আসলে বন্ধ করুন শেখা এটা!


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.read()
    print (filecontent)

পাইথনও অফার করে readlines() পদ্ধতি, যা অনুরূপ readline() প্রথম উদাহরণ থেকে পদ্ধতি। বিপরীতে read(), ফাইলের বিষয়বস্তু একটি তালিকায় সংরক্ষণ করা হয়, যেখানে বিষয়বস্তুর প্রতিটি লাইন একটি আইটেম:


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.readlines()
    for line in filecontent:
        print (line)

যদিও readlines() ফাইল থেকে বিষয়বস্তু পড়তে হবে যতক্ষণ না এটি EOF হিট করে, মনে রাখবেন যে আপনি প্রদান করে পড়ার সামগ্রীর পরিমাণ সীমিত করতে পারেন sizehint প্যারামিটার, যা পড়ার জন্য বাইটের সংখ্যা।

উপসংহার

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

যদিও পাইথন ফাইলগুলি পড়ার প্রক্রিয়াটিকে ব্যাপকভাবে সরল করে, এটি এখনও মাঝে মাঝে জটিল হয়ে উঠতে পারে, সেক্ষেত্রে আমি আপনাকে এক নজর দেখার সুপারিশ করব অফিসিয়াল পাইথন ডকুমেন্টেশন আরও তথ্যের জন্য.

সময় স্ট্যাম্প:

থেকে আরো Stackabuse