Python का बिल्ट-इन open() फ़ंक्शन एक फ़ाइल को रीड/राइट मोड में खोलता है और उस पर रीड/राइट ऑपरेशन करता है। बैच में मल्टीपल फ़ाइलों पर प्रोसेसिंग करने के लिए, Python की स्टैंडर्ड लाइब्रेरी के fileinput मॉड्यूल का उपयोग करना पड़ता है। यह मॉड्यूल फ़ाइलों पर इटरेट करने की कार्यक्षमता के साथ FileInput क्लास प्रदान करता है। मॉड्यूल इसी उद्देश्य के लिए हेल्पर फ़ंक्शन्स भी डिफाइन करता है।
इस मॉड्यूल का प्राथमिक इंटरफ़ेस input() फ़ंक्शन है। यह फ़ंक्शन FileInput क्लास का इंस्टेंस लौटाता है।
fileinput.input(files, inplace, mode)
files पैरामीटर पढ़ी जाने वाली एक या अधिक फ़ाइलों का नाम है। प्रत्येक फ़ाइल एक जेनरेटर की तरह काम करती है और फॉर लूप का उपयोग करके इस पर इटरेट किया जा सकता है। फ़ाइल में प्रत्येक लाइन Python कंसोल पर प्रिंट होगी।
>>> 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() यदि वर्तमान फ़ाइल की पहली लाइन पढ़ी जा रही है तो 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' में किए गए परिवर्तन दिखाई देंगे।