जब हम किसी प्रोग्राम में डेटा दर्ज करते हैं तो वह प्रोग्राम समाप्त होते ही नष्ट हो जाता है। यदि हम डेटा को स्थायी रूप से संग्रहीत करना चाहते हैं तो हमें उसे फाइल में सहेजना आवश्यक होता है। फाइल हैंडलिंग (File Handling) वह प्रक्रिया है जिसके द्वारा हम कंप्यूटर की मेमोरी में संग्रहीत फाइलों को पढ़ते (read), लिखते (write), अपडेट करते और सुधारते (append/update) हैं। पाइथन में फाइल हैंडलिंग के लिए अंतर्निहित (built-in) फलन open() का उपयोग किया जाता है। फाइल हैंडलिंग की सहायता से हम डेटा को रैम (RAM) के बजाय हार्ड डिस्क जैसे स्थायी भंडारण माध्यम में रख सकते हैं, जिससे डेटा प्रोग्राम समाप्त होने के बाद भी सुरक्षित रहता है।
फाइल में काम करने की प्रक्रिया को तीन मुख्य चरणों में विभाजित किया जा सकता है: पहला, फाइल को खोलना (open); दूसरा, फाइल पर आवश्यक कार्य करना (read/write); और तीसरा, फाइल को बंद करना (close)। फाइल को बंद न करने से डेटा हानि या मेमोरी रिसाव हो सकता है।
पाइथन में फाइल खोलने के लिए open() फलन का उपयोग किया जाता है। इसका सामान्य सिंटैक्स है:
file_object = open("filename", "mode")
जहाँ file_object फाइल के साथ संवाद करने का माध्यम है और mode यह निर्धारित करता है कि फाइल को किस उद्देश्य से खोलना है। फाइल को बंद करने के लिए close() विधि का उपयोग किया जाता है:
f = open("data.txt", "r")
# फाइल पर कार्य
f.close()
| मोड | अर्थ | कार्य |
|---|---|---|
r |
read (पढ़ना) | केवल पढ़ने के लिए; यदि फाइल नहीं है तो त्रुटि |
w |
write (लिखना) | लिखने के लिए; फाइल की पुरानी सामग्री मिट जाती है |
a |
append (जोड़ना) | फाइल के अंत में नया डेटा जोड़ता है |
r+ |
read/write | पढ़ने और लिखने दोनों के लिए |
w+ |
read/write | पढ़ने और लिखने के लिए, पुराना डेटा मिट जाता है |
a+ |
read/append | पढ़ने और अंत में जोड़ने के लिए |
टेक्स्ट मोड (डिफ़ॉल्ट) में डेटा वर्णों (characters) के रूप में संग्रहीत होता है, जबकि बाइनरी मोड में डेटा बाइट्स के रूप में संग्रहीत होता है। बाइनरी मोड के लिए मोड के साथ b जोड़ा जाता है, जैसे rb, wb, ab। बाइनरी मोड का उपयोग चित्र, ऑडियो, वीडियो जैसी फाइलों के लिए किया जाता है।
टेक्स्ट फाइल से डेटा पढ़ने के लिए पाइथन कई विधियाँ प्रदान करता है:
read() विधिread() विधि फाइल की पूरी सामग्री को एक स्ट्रिंग के रूप में लौटाती है। इसमें वर्णों की संख्या भी निर्दिष्ट की जा सकती है:
f = open("data.txt", "r")
content = f.read() # पूरी फाइल
first10 = f.read(10) # केवल 10 वर्ण
f.close()
readline() विधिreadline() विधि फाइल की एक पंक्ति पढ़कर लौटाती है। प्रत्येक कॉल पर अगली पंक्ति पढ़ी जाती है:
f = open("data.txt", "r")
line1 = f.readline()
print(line1)
f.close()
readlines() विधिreadlines() विधि फाइल की सभी पंक्तियों को सूची के रूप में लौटाती है, जिसमें प्रत्येक पंक्ति सूची का एक तत्व होती है:
f = open("data.txt", "r")
lines = f.readlines()
for line in lines:
print(line.strip())
f.close()
फाइल ऑब्जेक्ट एक इटरेटर के रूप में भी कार्य करता है, जिससे हम for लूप का उपयोग कर सकते हैं:
f = open("data.txt", "r")
for line in f:
print(line, end="")
f.close()
टेक्स्ट फाइल में डेटा लिखने के लिए write() और writelines() विधियों का उपयोग किया जाता है। लिखने के लिए फाइल को w, a या r+ मोड में खोलना आवश्यक है।
write() विधिf = open("output.txt", "w")
f.write("नमस्ते पाइथन!\n")
f.write("यह दूसरी पंक्ति है।\n")
f.close()
ध्यान दें कि write() में हमें नई पंक्ति का वर्ण \n स्वयं जोड़ना पड़ता है।
writelines() विधिlines = ["पंक्ति 1\n", "पंक्ति 2\n", "पंक्ति 3\n"]
f = open("output.txt", "w")
f.writelines(lines)
f.close()
writelines() सूची के सभी तत्वों को फाइल में लिख देता है, परंतु वह पंक्ति के अंत का वर्ण स्वतः नहीं जोड़ता।
append मोडa मोड में फाइल के अंत में नया डेटा जुड़ता है, पुराना डेटा सुरक्षित रहता है:
f = open("log.txt", "a")
f.write("नया लॉग संदेश\n")
f.close()
with स्टेटमेंट (संदर्भ प्रबंधक)with स्टेटमेंट की सहायता से फाइल को स्पष्ट रूप से बंद करने की आवश्यकता नहीं होती; ब्लॉक समाप्त होते ही फाइल स्वतः बंद हो जाती है:
with open("data.txt", "r") as f:
content = f.read()
print(content) # फाइल स्वतः बंद हो चुकी है
seek() और tell() विधियाँtell() विधि फाइल पॉइंटर की वर्तमान स्थिति (बाइट्स में) बताती है, और seek() विधि फाइल पॉइंटर को निर्दिष्ट स्थिति पर ले जाती है:
f = open("data.txt", "r")
print(f.tell()) # 0
data = f.read(5)
print(f.tell()) # 5
f.seek(0) # पॉइंटर को शुरुआत में
print(f.read(3))
f.close()
os मॉड्यूल के फलनफाइल के बारे में जानकारी प्राप्त करने के लिए os मॉड्यूल का उपयोग किया जा सकता है:
import os
print(os.path.getsize("data.txt")) # फाइल का आकार बाइट्स में
print(os.path.exists("data.txt")) # क्या फाइल मौजूद है
बाइनरी फाइलों में डेटा बाइट्स के रूप में संग्रहीत होता है। इन फाइलों को पढ़ने और लिखने के लिए pickle मॉड्यूल का उपयोग किया जाता है। pickle पाइथन ऑब्जेक्ट को बाइनरी रूप में परिवर्तित करने (serialization) और उसे पुनः पाइथन ऑब्जेक्ट में परिवर्तित करने (deserialization) की सुविधा देता है।
import pickle
data = {"नाम": "राहुल", "अंक": 95}
with open("record.dat", "wb") as f:
pickle.dump(data, f)
dump() विधि पाइथन ऑब्जेक्ट को बाइनरी फाइल में लिखती है।
import pickle
with open("record.dat", "rb") as f:
data = pickle.load(f)
print(data)
load() विधि बाइनरी फाइल से पाइथन ऑब्जेक्ट को पुनः प्राप्त करती है।
सीएसवी (Comma Separated Values) फाइलों में डेटा अल्पविराम द्वारा अलग किए गए रूप में संग्रहीत होता है। इनके लिए csv मॉड्यूल का उपयोग किया जाता है:
import csv
with open("marks.csv", "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(["नाम", "अंक"])
writer.writerow(["अनु", 85])
with open("marks.csv", "r") as f:
reader = csv.reader(f)
for row in reader:
print(row)
| मोड | विवरण | फाइल न होने पर |
|---|---|---|
r |
केवल पढ़ना | त्रुटि |
w |
केवल लिखना (पुराना मिटता है) | नई फाइल बनती है |
a |
अंत में जोड़ना | नई फाइल बनती है |
r+ |
पढ़ना + लिखना | त्रुटि |
w+ |
पढ़ना + लिखना (पुराना मिटता है) | नई फाइल बनती है |
a+ |
पढ़ना + जोड़ना | नई फाइल बनती है |
| विधि | कार्य | लौटाता है |
|---|---|---|
read(n) |
n वर्ण पढ़ना | स्ट्रिंग |
readline() |
एक पंक्ति पढ़ना | स्ट्रिंग |
readlines() |
सभी पंक्तियाँ | सूची |
write(s) |
स्ट्रिंग लिखना | वर्णों की संख्या |
writelines(list) |
सूची लिखना | कोई नहीं |
tell() |
पॉइंटर स्थिति | पूर्णांक |
seek(n) |
पॉइंटर को n पर ले जाना | कोई नहीं |
r मोड में लिखने की कोशिश: r मोड केवल पढ़ने के लिए है। इसमें लिखने पर UnsupportedOperation त्रुटि आती है; लिखने के लिए w या a मोड का उपयोग करें।w मोड का अत्यधिक उपयोग: w मोड में खोलते ही फाइल की सारी पुरानी सामग्री मिट जाती है। यदि डेटा जोड़ना है तो a मोड का उपयोग करना चाहिए।close() को भूलने से डेटा पूरी तरह से सहेजा नहीं जाता या मेमोरी लीक होती है। सबसे अच्छा है with स्टेटमेंट का उपयोग।\n नहीं जोड़ना: write() में पंक्ति समाप्ति का वर्ण \n स्वतः नहीं जुड़ता; इसे स्वयं जोड़ना आवश्यक है।writelines() का गलत उपयोग: writelines() के साथ भी प्रत्येक तत्व में \n होना आवश्यक है, अन्यथा सभी पंक्तियाँ एक साथ जुड़ जाती हैं।readlines() आदि के स्थान पर pickle.load() और pickle.dump() का उपयोग करें।r, w, a, r+, w+, a+) के कार्य और फाइल न होने पर उनके व्यवहार को तालिका के रूप में याद करें।read(), readline() और readlines() के बीच अंतर लिखित रूप में स्पष्ट करने का अभ्यास करें।tell() और seek() वाले कोड के आउटपुट के प्रश्न बहुत पूछे जाते हैं, इसलिए उनके साथ अभ्यास करें।with open(...) as f: संरचना का उपयोग करना न भूलें, यह परीक्षा में पूर्ण अंक दिला सकती है।dump() लिखने और load() पढ़ने के लिए है - इनका आपस में मेल न करें।फाइल हैंडलिंग पाइथन की एक अत्यंत महत्वपूर्ण क्षमता है जो डेटा को स्थायी रूप से संग्रहीत करने और पुनः प्राप्त करने की सुविधा प्रदान करती है। open() के माध्यम से फाइल को विभिन्न मोड में खोलकर हम टेक्स्ट, बाइनरी तथा सीएसवी फाइलों पर पढ़ने, लिखने और अपडेट करने के कार्य कर सकते हैं। read(), readline(), readlines(), write(), writelines(), seek() और tell() जैसी विधियाँ फाइल संचालन को सरल बनाती हैं। with स्टेटमेंट का उपयोग करके हम फाइल को स्वतः बंद कर सकते हैं, जो सर्वोत्तम अभ्यास है। बाइनरी फाइलों के लिए pickle तथा सीएसवी के लिए csv मॉड्यूल आवश्यक हैं। इन सभी अवधारणाओं का अभ्यास करके परीक्षा में अच्छे अंक प्राप्त किए जा सकते हैं।