ফাইল#
ফাইল নিয়ে বলার মতো তো কিছুই নাই। সরকারি দফতরে ফাইল নিয়ে যে কত্ত ধকল পোহাতে হয়েছে তা কেবল আল্লাহ মালুম। এক টেবিল থেকে অন্য টেবিলে তো দূরে থাক, একই টেবিলে ফাইলের স্তুপে নিচ থেকে উপরে তুলতেও কি আর কম ধকল? তবে পাইথনে ফাইল নিয়ে কাজবাজ করা এতটা কঠিন না। ফাইল নিয়ে কাজ করতে গিয়ে আমরা তিনটা জিনিস শিখব। ফাইল ওপেন (open) করা, ওপেন করা ফাইল রিড (read) করা, রিড করার পর ফাইল রাইট (write) করা আর শেষমেশ ফাইল ক্লোজ (close) করা।
প্রথমে আমরা শিখব কীভাবে সাধের ফাইলটা ওপেন করা যায়। কারণ, ফাইল ওপেন না করে তো আর বাকি কাজ করা যাবে না। পাইথনে ফাইল ওপেন করার জন্য open() ফাংশনটা ব্যবহার করব আমরা। এই ফাংশনটা তিনটা প্যারামিটার নিয়ে কাজ করে।
- ফাইলের নাম: প্রথম প্যারামিটার হলো ফাইলের নাম। আমাদের স্ক্রিপ্ট ও আলোচ্য ফাইল যদি একই ডিরেক্টরিতে হয় তবে শুধু ফাইলের নামটা স্ট্রিং হিসেবে দিতে হয়। ফাইল যদি আলাদা ডিরেক্টরিতে থাকে তবে পুরো পাথটা স্ট্রিং হিসেবে দিতে হবে।
- অ্যাক্সেস মোড: দ্বিতীয় প্যারামিটার হলো অ্যাক্সেস মোড। একটা ফাইলকে আমরা বিভিন্ন কাজের জন্য ওপেন করতে পারি। সেক্ষেত্রে ভিন্ন ভিন্ন কাজের জন্য ভিন্ন ভিন্ন মোডে ফাইলটা ওপেন করতে হবে। নিচে কয়েকটা মোডের নাম ও কোন কাজে লাগে তা দেওয়া হলো।
| মোড | বর্ণনা |
|---|---|
| r | এটা হলো ডিফল্ট মোড। কোনো মোড স্পেসিফাই করে না দেওয়া হলে এটা আপনা-আপনি কাজ করে। এটা শুধু রিড করার জন্য একটা ফাইলকে ওপেন করে। আর ফাইল পয়েন্টার ফাইলের শুরুতে থাকে। |
| rb | সবকিছু মোড r এর মতোই। শুধু তফাৎ হলো ফাইলটা বাইনারি ফরম্যাটে ওপেন করে। |
| r+ | সবকিছু মোড r এর মতোই। এক্সট্রা বেনেফিট হলো ফাইলটা রাইটও করা যায়। |
| rb+ | r+ আর rb এর কম্বিনেশন। |
| w | ফাইলকে রাইট মোডে ওপেন করে। ফাইলের অস্তিত্ব না থাকলে নিজ থেকেই ফাইল তৈরি করে নেয়। আর অস্তিত্ব থেকে থাকলে পুরোনো ফাইলকে ওভাররাইট করে। |
| wb | সবকিছু মোড w এর মতোই। শুধু তফাৎ হলো ফাইলটা বাইনারি ফরম্যাটে ওপেন করে। |
| w+ | সবকিছু মোড w এর মতোই। এক্সট্রা বেনেফিট হলো ফাইলটা রিডও করা যায়। |
| wb+ | w+ আর wb এর কম্বিনেশন। |
| a | ফাইলকে অ্যাপেন্ড (append) মোডে ওপেন করে। এই মোডে ফাইল পয়েন্টার ফাইলের একেবারে শেষে থাকে। ফাইল রাইট করলে তা ফাইলের শেষে যোগ হয়। ফলে আগের সব ডেটা রক্ষিত থাকে। তবে ফাইলের অস্তিত্ব না থাকলে নিজ থেকেই ফাইল তৈরি করে নেয়। |
| ab | সবকিছু মোড a এর মতোই। শুধু তফাৎ হলো ফাইলটা বাইনারি ফরম্যাটে ওপেন করে। |
| a+ | সবকিছু মোড a এর মতোই। এক্সট্রা বেনেফিট হলো ফাইলটা রিডও করা যায়। |
| ab+ | a+ আর ab এর কম্বিনেশন। |
- বাফারিং: তৃতীয় প্যারামিটার হলো বাফারিং। এটা একটু উচ্চতর বিষয়। আমরা এটা সম্পর্কে পরে জানব।
কয়েকটা উদাহরণ দিলে বিষয়গুলো আরো পরিষ্কার হয়ে যাবে আমাদের কাছে। এজন্য আমরা ছোট্ট একটা কাজ করব। আমাদের স্ক্রিপ্টের সাথে একই ডিরেক্টরিতে test.txt নামে একটা ফাইল তৈরি করব। তারপর ফাইলে The name of my country is Bangladesh. কথাটা লিখে সেইভ করে রাখব। এবার কয়েকটা প্রোগ্রাম লেখা যাক।
my_file = open('test.txt', 'r')
content = my_file.read()
print(content)
my_file.close()আউটপুট
The name of my country is Bangladesh.প্রোগ্রামটার ময়নাতদন্ত করা যাক একটু। প্রথম লাইনে আমরা ফাইলটা রিড মোডে ওপেন করেছি। দ্বিতীয় লাইনে ফাইলটা read() ফাংশনের (আসলে মেথড) সাহায্যে রিড করে ডেটা content ভেরিয়েবলে অ্যাসাইন করেছি। আর শেষ লাইনে close() ফাংশন (মেথড) ব্যবহার করে ফাইলটা ক্লোজ করে দিয়েছি। আরেকটা প্রোগ্রাম দেখা যাক।
my_file = open('test.txt', 'w')
my_file.write('I am Maksudur Rahman Maateen.')
my_file.close()এখানে write() ফাংশন (মেথড) ব্যবহার করে আমরা ফাইলটা রাইট করেছি। এই ফাংশনের ভেতরে স্ট্রিং হিসেবে যা দেওয়া হবে তাই রাইট হবে ফাইলে। প্রোগ্রামটা রান করলে আমরা আউটপুট কিছুই পাব না। তবে ফাইলটা যদি নরমালি ওপেন করে দেখি তাহলে দেখব সেখানে এখন The name of my country is Bangladesh. এর পরিবর্তে I am Maksudur Rahman Maateen. লেখা রয়েছে। এবার আরেকটা প্রোগ্রাম দেখা যাক।
my_file = open('test.txt', 'a')
my_file.write('I am from Bangladesh.')
my_file.close()এই প্রোগ্রামটা রান করলেও আমরা আউটপুট কিছুই পাব না। তবে ফাইলটা যদি নরমালি ওপেন করে দেখি তাহলে দেখব সেখানে এখন I am Maksudur Rahman Maateen. এর পরে I am from Bangladesh. লেখা রয়েছে। এবার আরেকটা প্রোগ্রাম দেখা যাক।
my_file = open('test.txt', 'r')
content = my_file.read(5)
print(content)
content = my_file.read()
print(content)
position = my_file.tell()
print(position)
my_file.seek(0, 0)
content = my_file.read()
print(content)
my_file.close()আউটপুট
I am
Maksudur Rahman Maateen.I am from Bangladesh.
51
I am Maksudur Rahman Maateen.I am from Bangladesh.লম্বা-চওড়া একটা প্রোগ্রাম। আমরা এবার এটা ব্যাখ্যায় যাব। দ্বিতীয় লাইনে read() এর ভেতরে আমরা 5 ভ্যালু পাস করেছি। এর ফলে ফাইলের প্রথম ৫টা ক্যারেক্টার পর্যন্ত রিড হবে শুধু। স্পেসও একটা ক্যারেক্টার, এটা তো আমরা নিশ্চয়ই জানি। যাহোক, ষষ্ঠ লাইনে এসে আমরা tell() ফাংশন দিয়ে ফাইল পয়েন্টারের পজিশন খুঁজে বের করেছি। আর অষ্টম লাইনে seek() ফাংশন দিয়ে ফাইল পয়েন্টার আবার শুরুতে নিয়ে গিয়েছি। আরেকটা উদাহরণ দেখা যাক।
with open('test.txt', 'r') as my_file:
content = my_file.read()
print(content)আউটপুট
I am Maksudur Rahman Maateen.I am from Bangladesh.এই প্রোগ্রামে আমরা with স্টেটমেন্ট ব্যবহার করেছি। স্টেটমেন্টটা ব্যবহার করে ফাইলটা my_file নামে ওপেন করেছি। বাকি অপারেশন নরমাল। কেউ কি লক্ষ্য করেছি যে আমরা ফাইলটা ক্লোজ করিনি? আসলে এটাই এই স্টেটমেন্টের সুবিধা। কাজ শেষে বা কোনো এরর পেলে নিজ থেকেই ফাইলটা ক্লোজ করে দেয়।
এই ছিল ফাইল নিয়ে আমাদের বেসিক আলোচনা। এখন বাড়ির কাজ আছে। একটা ফাইলে লুপ ঘুরিয়ে ১ থেকে ১০০ পর্যন্ত লাইন বাই লাইন রাইট করব আমরা। কি পারব তো সবাই? চেষ্টা করলে অবশ্যই পারব।