পাইথনে ফাইল হ্যান্ডেলিং

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

Prerequisite

যেকোনো ফাইল আমরা আমাদের ডিস্কে যেভাবে দেখি তার সিনট্যাক্স হলোঃ `file_name.extension`

Example:
1. the_dark_knight.mp4 – এখানে demo হলো file_name এবং mp4 হলো extension
2. jocker.py – এখানে some হলো file_name এবং py হলো extension
3. batman.txt – এখানে some হলো file_name এবং txt হলো extension

ফাইল পড়া

ধরা যাক , আমাদের ডিরেক্টরিতে নিচের ফাইল গুলো আছে, batman.txt এ কিছু বাক্য লিখা আছে , আর gotham.py এ আমরা আমাদের যাবতীয় পাইথনের কোডগুলি লিখব।

├── batman.txt
└── gotham.py

 

##batman.txt

## Bruce Wayne
## Owner of Wayne Enterprises
## Born in 1991
## Genius detective
## Brutal combatant
## It's not who I am underneath, but what I do that defines me.

batman.txt এর উপরের লিখাগুলোই আমরা পাইথন দিয়ে পড়ে দেখবো

ফাইল হ্যান্ডেল করতে আমরা পাইথনের বিল্ট-ইন open() ফাংশন এর হেল্প নিবো।  open(param1, param2) ফাংশনটি দু’টি স্ট্রিং প্যারামিটার নিবে।
– *param1* – যে ফাইলটি ওপেন করতে চাচ্ছি তার Path যেটা আমাদের ক্ষেত্রে batman.txt
যেহেতু আমাদের পাইথন স্ক্রিপ্ট এবং টেক্সট ফাইলটি একই ডিরেক্টরিতে আছে, সেজন্য আমরা শুধু ফাইলের নামটা দিয়েছি। এছাড়া পুরো ফাইল path দিলেও কাজ করবে। যেমনঃ /home/vivasoft/Desktop/the_dark_knight/batman.txt. পাইথন স্ক্রিপ্ট এবং টেক্সট ফাইল দু’টি যদি দুই ডিরেক্টরিতে হয়, তাহলে অবশ্যই পুরো ফাইল path দিতে হবে।
– *param2* – কোন mode এ ফাইলটি open করতে চাই। ফাইল পড়তে “r” দিতে হবে। আর কি কি mode দেয়া যাবে, সেটা একটু পরে বলা হবে। আমরা open() ফাংশনের রিটার্ন করা ভ্যালু স্টোর করে পরবর্তীতে কাজে লাগাবো।

batman = open('batman.txt','r')

যেটা মাথায় রাখতে হবে – একটা ফাইল ওপেন করার সাথে সাথে সেটাকে সাথে সাথে ক্লোজ করার কোড লিখে ফেলা। ফাইল ক্লোজ করা গুড প্র্যাকটিস। ভ্যারিয়েবল batman দিয়েই ফাইল ক্লোজ করা যাবে।

batman.close()

ফাইল ওপেন এবং ক্লোজ এর মাঝেই আমরা ফাইল নিয়ে যাবতীয় কোড লিখবো।

batman = open('batman.txt','r')
""" I am vengeance. I am the night. I am Batman. """
batman.close()

পুরো ফাইল একবারে প্রিন্ট করতে চাইলে

batman ভ্যারিয়েবল থেকে read() মেথড দিয়ে আমরা সম্পূর্ণ কন্টেন্ট একবারে পড়তে পারবো।

batman = open('batman.txt','r')
print(batman.read())
batman.close()

## **output**

## Bruce Wayne
## Owner of Wayne Enterprises
## Born in 1991
## Genius detective
## Brutal combatant
## It's not who I am underneath, but what I do that defines me.

ফাইলের উপর লুপ চালিয়ে কন্টেন্ট পড়া

batman ভ্যারিয়েবলের উপর কিন্তু আমরা iteration ও চালাতে পারবো।

batman = open('batman.txt','r')
for no,line in enumerate(batman):
print(f"{no}. {line}",end="")
batman.close()


## **output**
## 0. Bruce Wayne
## 1. Owner of Wayne Enterprises
## 2. Born in 1991
## 3. Genius detective
## 4. Brutal combatant
## 5. It's not who I am underneath, but what I do that defines me.

নির্দিষ্ট কয়েকটা ক্যারেক্টার পড়ার করার জন্য

read() মেথডের মধ্যে ক্যারেক্টার সংখ্যা দিয়ে দিবো। ১১ টা অক্ষর পড়তে চাইলেঃ

batman = open('batman.txt','r')
print(batman.read(11))
batman.close()


## **output**
## Bruce Wayne

একটি লাইন একবারে লাইন পড়ার জন্য

readline() মেথড একটি একটি করে লাইন পড়ে থাকে। প্রতি লাইন পড়া হলে লাইন পয়েন্ট করে রাখে। আবার readline() কল করলে পরের লাইনটি দেখায়।

batman = open('batman.txt','r')
print(batman.readline(),end="")
print(batman.readline(),end="")
print("\tYou're harder to kill than a cockroach on steroids!")
print(batman.readline(),end="")
print(batman.readline(),end="")
print("\tWe all wear masks.")
print(batman.readline(),end="")
print(batman.readline(),end="")
batman.close()


## **output**

## Bruce Wayne
## Owner of Wayne Enterprises
## You're harder to kill than a cockroach on steroids!
## Born in 1991
## Genius detective
## We all wear masks.
## Brutal combatant
## It's not who I am underneath, but what I do that defines me.

দেখা যাচ্ছে, ফাইল পড়ার মাঝে আমরা অন্য কোন কোডও এক্সিকিউট করতে পারি। তাছাড়া, ফাইল পুরো পড়া শেষ হয়ে গেলেও, readline() method টি করলেও এরর দিবে না।

ফাইলে লেখা

কোন ফাইল write করা বলতে বুঝায় – আগে তৈরী কোন ফাইলে কোন কন্টেন্ট যোগ করা অথবা নতুন করে ফাইল তৈরী করে সেই ফাইলে লিখা। এর জন্য আমরা দু’টি mode এর ব্যবহার দেখবো।

“w” mode এর ব্যবহার

যদি কোন ফাইল আগেই তৈরী করা থাকে, তাহলে সে ফাইলে কোন কন্টেন্ট থাকলেও “w” mode এ open করার কারণে, এর সব কন্টেন্ট হারিয়ে যাবে। এরপর আমরা ফাইলে নতুন যেকোনো কিছু লিখতে পারবো। তবে, প্রতিবার আগের ফাইল “w” mode এ open করলে, প্রতিবারই ফাইলটির কন্টেন্ট মুছে যাবে।
এখন jocker.txt নামে একটি ফাইল তৈরী করি-

file_content = open('jocker.txt','w')
file_content.write("Why so serious?\n")
file_content.close()

এখন jocker.txt ফাইলটি open করলে আমরা দেখতে পারবো – Why so serious? এই লিখা টি চলে আসছে।
উল্লেখ্য, যেকোনো লাইন লিখার সাথে সাথে \n দেয়াটা ভালো। ফাইল append করার সময় আমরা এটার প্রয়োজনীয়তা বুঝতে পারবো। ফাইল append নিয়ে পরের সেকশন এ আলোচনা করা হবে।
আবার আরেকটা কিছু যদি লিখতে যাই, তাইলে দেখবো আগের লিখাটি চলে গিয়ে, নতুন লিখা replace হয়ে গিয়েছে ।

file_content = open('jocker.txt','w')
file_content.write("Do I Look Like a Guy with a Plan?\n")
file_content.close()

আগে jocker.txt নামে কোন ফাইল তৈরী না থাকলেও, উপরের কোড অটোমেটিক্যালি jocker.txt নামে একটি ফাইল তৈরী করে নিবে।

“x” mode এর ব্যবহার

“x” mode দিয়েও কোন ফাইলে লিখা যায়। তবে শর্ত হচ্ছে, যে ফাইলের নামে দিবো, সেটি আগে থেকে থাকলে হবে না। এটি সব সময় নতুন ফাইল তৈরী করে।

file_content = open('jocker.txt','w')
file_content.write("Do I Look Like a Guy with a Plan?\n")
file_content.close()

এখানে নতুন একটি ফাইল তৈরী হয়ে গিয়েছে। সাথে সাথে ফাইলের মধ্যে লিখাটিও। এখানে যদি, ফাইলটি আগে থেকেই তৈরী থাকে তাহলে এরর হবে।
তাহলে কোডটি নিচের মতো করে লিখা যায়।

try:
    file_content = open('batpod.txt','x')
    file_content.write("Ready to role on!\n")
    file_content.close()
except:
    print("Batpod already existed in Batcave.")

Append: “a” mode এর ব্যবহার

append মানে হচ্ছে, ফাইলে যেই কন্টেন্ট আছে, সেই কন্টেন্ট এর সাথে নতুন কোন কন্টেন্ট যোগ করা।

এজন্য আমরা “a” mode এ jocker.txt ফাইলটি আবার open করি ও আউটপুট খেয়াল করে দেখি-

file_content = open('jocker.txt','a')
file_content.write("When you bring me out, can you introduce me as Joker?\n")
file_content.close()


## **output** 

## Do I Look Like a Guy with a Plan?
## When you bring me out, can you introduce me as Joker?

jocker.txt ফাইলে ইতিমধ্যে “Do I Look Like a Guy with a Plan?” লিখে ছিলো। এখন নতুন লাইন যোগ হয়ে গেলো। এখানে \n দিয়ে write করার জন্য, “When you bring me out, can you introduce me as Joker?”  লিখাটি নতুন লাইনে লেখা হয়েছে।
আগে jocker.txt নামে কোন ফাইল তৈরী না থাকলেও, উপরের কোড রান করলে অটোমেটিক্যালি jocker.txt নামে একটি ফাইল তৈরী করে নিবে।

 

| Mood | Task | remark |
| ——– | ——– | ——– |
| r | To read a file | ফাইলটি আগে থেকে তৈরী থাকতে হবে |
| w | To write a file | ফাইলটি আগে থেকে তৈরী না থাকলে , তৈরী হয়ে যাবে |
| x | To write a file | ফাইলটি আগে থেকে তৈরী থাকতে হবে |
| a | To append a file | ফাইলটি আগে থেকে তৈরী না থাকলে , তৈরী হয়ে যাবে |

***

 

উদাহরন
Appending into text file
file = open('my_file.txt','a')
file.write("I am appending into my file.\n")
file.close()


// verify it
file = open('my_file.txt','r')
print(file.read())
file.close()

 

এসো নিজে করি

 

১। একটি কন্টাক্ট সিস্টেম বানাতে হবে, যেখানে কন্টাক্ট নেম এবং ফোন নাম্বার একটি টেক্সট ফাইলে স্টোর করতে হবে। আমরা কোন কন্টাক্ট সার্চ করতে পারবো, এডিট করতে পারবো এবং ডিলিটও করতে পারবো। সবগুলো কন্টাক্ট-লিস্টও দেখতে পারবো। কনসোল থেকেই ইনপুট নিব, কনসোল এই আউটপুট দেখাবো।
 
নিচে একটি নমুনা দেখানো হলঃ
 
 
Select one :
1.Insert
2.Search
3.Edit
4.Delete
5.All
Any key to exit
 
Please Enter : 5
All contacts:
Name: asif | Contact: 123456
Name: murad | Contact: 98657
Name: shuvo | Contact: 0000111

 

Select one :
1.Insert
2.Search
3.Edit
4.Delete
5.All
Any key to exit
 
Please Enter : 1
Enter Name : murad
Already Exist !

 

Select one :
1.Insert
2.Search
3.Edit
4.Delete
5.All
Any key to exit
 
Please Enter : 1
Enter Name : Shakib
Enter Number : 757575
Added

 

Select one :
1.Insert
2.Search
3.Edit
4.Delete
5.All
Any key to exit
 
Please Enter : 40
Program Closed …

 

ইন্টারভিউ প্রশ্নোত্তর
গুরুত্বপূর্ন প্রশ্নসমুহ

* ফাইল হ্যান্ডেল এর মুডগুলো কি কি ?
* x – mood এর কি কোন অসুবিধা আছে ?
* এপেন্ড করার জন্য w – mood ব্যাবহার করব কি ?