পাইথনের বিল্ট-ইন open() ফাংশন একটি ফাইল পড়া/লিখার মোডে খুলে সেটার ওপর অপারেশন করে। একাধিক ফাইল ব্যাচে প্রসেস করতে হলে পাইথনের স্ট্যান্ডার্ড লাইব্রেরির fileinput মডিউল ব্যবহার করতে হয়। এই মডিউল Fileinput ক্লাস প্রদান করে যাতে ফাইলগুলোর ওপর ইটারেশন করা যায়। মডিউলটি একই উদ্দেশ্যে হেল্পার ফাংশনও সংজ্ঞায়িত করে।
এই মডিউলের প্রাইমারি ইন্টারফেস হলো input() ফাংশন। এই ফাংশনটি Fileinput ক্লাসের ইনস্ট্যান্স ফেরত দেয়।
fileinput.input(files, inplace, mode)
files প্যারামিটার হলো পড়ার জন্য এক বা একাধিক ফাইলের নাম। প্রতিটি ফাইল একটি জেনারেটর হিসেবে কাজ করে এবং for লুপ ব্যবহার করে সেটার ওপর ইটারেট করা যায়। ফাইলের প্রতিটি লাইন পাইথন কনসোলে প্রিন্ট হবে।
>>> for line in fileinput.input('data.txt'):
... print(line)
files প্যারামিটার একটি টাপল হতে পারে যাতে অনেক ফাইল থাকে। ফাইলগুলোর কন্টেন্ট একে একে প্রদর্শিত হবে।
>>> for line in fileinput.input(files=('a.txt', 'b.txt')):
... print(line)
Fileinput ক্লাসটি with স্টেটমেন্টে কনটেক্সট ম্যানেজার হিসেবেও ব্যবহার করা যায়।
>>> with fileinput.input(files=('a.txt', 'b.txt')) as f:
... for line in f:
... print(line)
fileinput মডিউলে নিচের ফাংশনগুলো সংজ্ঞায়িত:
| ক্র.নং | ফাংশন ও বর্ণনা |
|---|---|
| 1 | filename() বর্তমানে পড়া হচ্ছে এমন ফাইলের নাম ফেরত দেয়। |
| 2 | fileno() ফাইল ডেসক্রিপ্টর ইন্টিজার ফেরত দেয়। |
| 3 | lineno() পড়া হচ্ছে এমন ফাইলের লাইন নম্বর ফেরত দেয়। নম্বরটি কিউমুলেটিভ কাউন্ট। |
| 4 | filelineno() শুধু বর্তমান ফাইলের লাইন নম্বর ফেরত দেয়। |
| 5 | isfirstline() ব naastে ফাইলের প্রথম লাইন পড়া হচ্ছে কিনা তা চেক করে (true/false)। |
নিচের স্টেটমেন্টটি ফাইলের প্রতিটি লাইন লাইন নম্বরসহ প্রিন্ট করে:
>>> for line in fileinput.input('books.py'):
... print('{}->{}'.format(fileinput.filelineno(), line))
উপরোক্ত কোডের নমুনা আউটপুট:
1->import sqlite3
2->conn = sqlite3.connect('c:/python36/books.db')
3->cursor = conn.cursor()
4->cursor.execute("SELECT * from books;")
5->print(cursor.fetchall())
নিচের কোডটি ফোল্ডারের প্রতিটি ফাইলনেম প্রিন্ট করে এবং তারপর নম্বরসহ লাইনগুলো দেখায়। এই প্রোগ্রামে glob() ফাংশন ব্যবহার করা হয়েছে যা করেন্ট পাথে থাকা ফাইলগুলোর লিস্ট ফেরত দেয় (ওয়াইল্ডকার্ড মিলানো যাবে)। এখানে glob('*.py') করেন্ট ফোল্ডারের সব .py এক্সটেনশন ফাইল ফেরত দেবে। এই লিস্টটি fileinput.input() ফাংশনের files প্যারামিটার হিসেবে ব্যবহার করা হয়েছে।
import fileinput, glob, sys
for line in fileinput.input(glob.glob("*.py")):
if fileinput.isfirstline():
print(fileinput.filename(), '>')
sys.stdout.write("{}.{}".format(fileinput.filelineno(), line))
isfirstline() ফাংশন ব্যবহারের নোট করুন। নতুন ফাইলের ইটারেশন শুরু হলে এই ফাংশন true ফেরত দেয় এবং fileinput.filename() ফাংশন দ্বারা ফাইলনেম প্রথমে প্রিন্ট হয়, তারপর লাইন নম্বরসহ প্রদর্শিত হয়। উদাহরণ:
1.py >
1.a = 10
2.b = 20
3.print ('addition=', a+b)
hello.py >
1.x = 10
2.y = 20
3.z = x+y
4.print ("x+y=", z)
inplace প্যারামিটার
fileinput.input() ফাংশনের জন্য ডিফল্ট inplace = False। যদি এটি True সেট করা হয়, তবে ইনপুট ফাইলটি রাইটেবল হয়ে যায়।
ধরি 'msg.txt' ফাইলে নিচের টেক্সট আছে:
Hello Python. Good morning
নিচের কোড fileinput মডিউল দিয়ে ফাইলটি খুলে এর কন্টেন্ট ইন-প্লেস পরিবর্তন করে:
>>> for line in fileinput.input(files='msg.txt', inplace=True):
... line = line.replace('morning', 'evening')
... sys.stdout.write(line)
'msg.txt'-এ করা পরিবর্তনগুলো দেখাবে।