पायथन के साथ फ़ाइलें पढ़ना

परिचय

संग्रहीत डेटा के साथ काम करने के लिए, फ़ाइल प्रबंधन प्रत्येक पेशेवर पायथन प्रोग्रामर का मुख्य ज्ञान बन जाता है। इसकी शुरुआती रिलीज़ से ही, डेटा को पढ़ने और लिखने से लेकर फाइलों तक, दोनों ही बिल्ट-इन पायथन फीचर्स हैं। C या Java जैसी अन्य प्रोग्रामिंग भाषाओं की तुलना में, यह बहुत सरल है और इसके लिए केवल कोड की कुछ पंक्तियों की आवश्यकता होती है। इसके अलावा, इसे ठीक से करने के लिए किसी अतिरिक्त मॉड्यूल को लोड करने की आवश्यकता नहीं है।

इस लेख में हम उदाहरण के माध्यम से समझाएंगे कि पायथन के साथ फाइलों को कैसे पढ़ा जाए। कुछ उदाहरणों में एक फ़ाइल को लाइन-बाय-लाइन पढ़ना, एक चंक के रूप में (एक समय में लाइनों की एक निर्धारित संख्या), और एक बार में एक फ़ाइल को पढ़ना शामिल है। साथ ही, हम आपको पूरी फाइल को खोजे बिना केवल फाइल से एक विशिष्ट लाइन को पढ़ने का एक तरीका दिखाएंगे।

पायथन में फाइलों की मूल बातें

फाइलों के साथ काम करने के सामान्य तरीके हैं open() फ़ाइल खोलने के लिए, seek() फ़ाइल की वर्तमान स्थिति को दिए गए ऑफ़सेट पर सेट करने के लिए, और close() फ़ाइल ऑब्जेक्ट को बंद करने के लिए जब आप इसका उपयोग कर रहे हों। बिल्ट-इन open() फ़ंक्शन एक फ़ाइल हैंडल देता है जो फ़ाइल ऑब्जेक्ट का प्रतिनिधित्व करता है जिसका उपयोग फ़ाइल को पढ़ने, लिखने या जोड़ने के लिए फ़ाइल तक पहुंचने के लिए किया जाता है।

पढ़ने के लिए फ़ाइल खोलते समय, पायथन को यह जानना आवश्यक है कि फ़ाइल को सिस्टम के साथ कैसे खोला जाना चाहिए। दो एक्सेस मोड उपलब्ध हैं - बाइनरी मोड में पढ़ना और पढ़ना। इस्तेमाल किए गए संबंधित झंडे हैं 'r', तथा 'rb', और बिल्ट-इन के साथ फ़ाइल खोलते समय निर्दिष्ट करना होगा open() समारोह। पहले मोड में लाइन ब्रेक का प्रतिनिधित्व करने के लिए "सीआर" (कैरिज रिटर्न) और "एलएफ" (लाइनफीड) जैसे विशेष वर्णों की व्याख्या शामिल है, जबकि बाइनरी मोड आपको कच्चे मोड में डेटा पढ़ने की अनुमति देता है - जहां डेटा संग्रहीत किया जाता है आगे की व्याख्या के बिना।

एक बार जब आप कोई फ़ाइल खोल लेते हैं, तो open() फ़ंक्शन आपको एक फ़ाइल ऑब्जेक्ट लौटाएगा। इन फ़ाइल ऑब्जेक्ट्स में विधियाँ हैं: read(), readline(), write(), tell(), तथा seek(). जबकि कुछ फ़ाइल ऑब्जेक्ट (या फ़ाइल जैसी ऑब्जेक्ट) में यहां सूचीबद्ध विधियों की तुलना में अधिक विधियाँ हैं, ये सबसे आम हैं। सभी फ़ाइल ऑब्जेक्ट्स को सभी फ़ाइल विधियों को लागू करने की आवश्यकता नहीं है।

फ़ाइल लाइन-दर-पंक्ति पढ़ना

पहला उदाहरण दो प्रोग्रामिंग भाषाओं - C और C++ से प्रेरित है। यह शायद सबसे सहज दृष्टिकोण है - फ़ाइल का उपयोग करके खोलें open() समारोह, फ़ाइल को पंक्ति-दर-पंक्ति पढ़ें का उपयोग readline() विधि, और पढ़ने के तुरंत बाद लाइन को आउटपुट करें।

यहाँ उपयोग में है a while लूप जो लगातार फ़ाइल से तब तक पढ़ता है जब तक readline() विधि डेटा लौटाती रहती है। फ़ाइल के अंत (ईओएफ) के मामले में while लूप बंद हो जाता है और फ़ाइल ऑब्जेक्ट बंद हो जाता है, अन्य प्रोग्रामों के उपयोग के लिए संसाधनों को मुक्त करता है:


filename = "test.txt"

filehandle = open(filename, 'r')
while True:
    
    line = filehandle.readline()
    if not line:
        break
    print(line)


filehandle.close()

जैसा कि आपने नोट किया होगा, हमने इस उदाहरण में फ़ाइल को स्पष्ट रूप से खोला और बंद किया है। यद्यपि पायथन दुभाषिया पायथन प्रोग्राम के निष्पादन के अंत में खोली गई फ़ाइलों को स्वचालित रूप से बंद कर देता है, फ़ाइल को स्पष्ट रूप से बंद कर देता है close() प्रोग्रामिंग शैली अच्छी है, और इसे नहीं भूलना चाहिए।

एक सुधार के रूप में, सुविधाजनक इटरेटर प्रोटोकॉल पायथन 2.3 में पेश किया गया था। यह आपको सरल बनाने की अनुमति देता है readline पाश:


filename = "test.txt"
for line in open(filename, 'r'):
    print(line)

यहाँ उपयोग में है a for के साथ संयोजन में लूप in पुनरावर्तक करंट लाइन की पहचान की मदद से की जाती है in इटरेटर, फ़ाइल से पढ़ा जाता है, और इसकी सामग्री आउटपुट है stdout. जब यह दायरे से बाहर हो जाता है तो पायथन आपके लिए फ़ाइल के उद्घाटन और समापन को कवर करता है। अक्षम होने पर, यह आपको अब फ़ाइल हैंडल से निपटने की अनुमति नहीं देता है।

दुर्भाग्य से, उपरोक्त कोड कम स्पष्ट है और फ़ाइल को बंद करने के लिए पायथन के आंतरिक कचरा संग्रह पर निर्भर करता है।

पायथन 2.5 में पेश किया गया, with कमांड पूरी प्रक्रिया को और भी अधिक एनकैप्सुलेट करता है, और स्कोप्ड कोड ब्लॉक में सिर्फ एक बार फाइलों को खोलने और बंद करने का काम भी करता है:


filename = "test.txt"
with open(filename, 'r') as filehandle:
    for line in filehandle:
        print(line)

का संयोजन with बयान और open() कमांड फ़ाइल को केवल एक बार खोलता है। सफल होने पर for लूप निष्पादित किया जाता है, और लाइन की सामग्री को मुद्रित किया जाता है stdout.

इसके अलावा, का उपयोग with बयान का एक साइड इफेक्ट है। आंतरिक रूप से, पायथन दुभाषिया बनाता है a try-finally-ब्लॉक फ़ाइल से पढ़ने को समाहित करने के लिए। निम्नलिखित उदाहरण से पता चलता है कि पायथन में अनिवार्य रूप से आंतरिक रूप से क्या हो रहा है with कोड ब्लॉक:

try:
    filehandle = open(filename, 'r')
    
finally:
    filehandle.close()

किसी फ़ाइल को पंक्तियों के भाग के रूप में पढ़ना

अब तक, हमने एक फ़ाइल को लाइन दर लाइन संसाधित किया है। यह बड़ी फ़ाइलों के लिए अपेक्षाकृत धीमा है और एक ही समय में कई पंक्तियों को पढ़कर इसमें सुधार किया जा सकता है। इसे हासिल करने के लिए, islice() से विधि itertools मॉड्यूल खेल में आता है। साथ ही, यह एक पुनरावर्तक के रूप में काम करता है और डेटा का एक हिस्सा देता है जिसमें शामिल हैं n लाइनें। फ़ाइल के अंत में, परिणाम छोटा हो सकता है, और अंत में, कॉल एक खाली सूची लौटाएगा:

from itertools import islice

filename = "test.txt"

number_of_lines = 5

with open(filename, 'r') as input_file:
    lines_cache = islice(input_file, number_of_lines)
   
    for current_line in lines_cache:
        print (current_line)

एक फ़ाइल से एक विशिष्ट पंक्ति पढ़ना

ऊपर दिखाए गए तरीकों का उपयोग करके हम अन्य उपयोगी क्रियाएं भी कर सकते हैं, जैसे किसी फ़ाइल से एक विशिष्ट पंक्ति को पढ़ना। ऐसा करने के लिए, हम एक काउंटर का उपयोग करते हैं और फ़ाइल के माध्यम से पुनरावृति करते समय उपयुक्त लाइन को प्रिंट करते हैं:


filename = "test.txt"

line_number = 3
print (f"line {line_number} of {filename} is: ")

with open(filename, 'r') as filehandle:
current_line = 1
    for line in filehandle:
        if current_line == line_number:
            print(line)
            break
        current_line += 1

यह समझना आसान होना चाहिए, लेकिन यह पिछले उदाहरणों की तुलना में थोड़ा लंबा है। इसे का उपयोग करके छोटा किया जा सकता है लाइनकैश मॉड्यूल।

निम्नलिखित उदाहरण से पता चलता है कि कोड का उपयोग करके कोड को कैसे सरल बनाया जाए getline() तरीका। यदि अनुरोधित लाइन नंबर फ़ाइल में मान्य लाइनों की सीमा से बाहर हो जाता है, तो getline() विधि इसके बजाय एक खाली स्ट्रिंग देता है:


import linecache

filename = "test.txt"

line_number = 3

line = linecache.getline(filename, line_number)
print (f"line {line_number} of {filename}:")
print (line)

एक बार में पूरी फाइल पढ़ना

अंतिम लेकिन कम से कम हम पिछले उदाहरण की तुलना में एक बहुत ही अलग मामले पर एक नज़र डालेंगे - एक बार में पूरी फाइल को पढ़ना।

ध्यान रखें कि ज्यादातर मामलों में आपके पास पूरी फ़ाइल को पढ़ने के लिए पर्याप्त मेमोरी होनी चाहिए, क्योंकि वर्ण बहुत अधिक स्थान नहीं लेते हैं, लेकिन बड़ी फ़ाइलों से थके हुए होते हैं। निम्नलिखित उदाहरण के संयोजन का उपयोग करता है with बयान, और read() तरीका। इस मामले में, हम उपयोग करेंगे read() फ़ाइल सामग्री को डेटा स्ट्रीम के रूप में लोड करने के लिए:

सर्वोत्तम प्रथाओं, उद्योग-स्वीकृत मानकों और शामिल चीट शीट के साथ, Git सीखने के लिए व्यावहारिक मार्गदर्शिका देखें। Googling Git कमांड को रोकें और वास्तव में सीखना यह!


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.read()
    print (filecontent)

पायथन भी प्रदान करता है readlines() विधि, जो के समान है readline() पहले उदाहरण से विधि। के विपरीत read(), फ़ाइल सामग्री को एक सूची में संग्रहीत किया जाता है, जहां सामग्री की प्रत्येक पंक्ति एक आइटम होती है:


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.readlines()
    for line in filecontent:
        print (line)

जबकि readlines() फ़ाइल से सामग्री को तब तक पढ़ेगा जब तक वह ईओएफ हिट नहीं करती, ध्यान रखें कि आप प्रदान करके पढ़ी गई सामग्री की मात्रा को भी सीमित कर सकते हैं sizehint पैरामीटर, जो पढ़ने के लिए बाइट्स की संख्या है।

निष्कर्ष

हमेशा की तरह, फ़ाइल की सामग्री को पढ़ने के एक से अधिक तरीके हैं। गति के मामले में, ये सभी कमोबेश एक ही श्रेणी में हैं। आपके लिए कौन सा समाधान सबसे अच्छा काम करता है यह आपके विशिष्ट उपयोग के मामले पर निर्भर करता है। हमें लगता है कि यह देखना काफी मददगार है कि क्या संभव है और फिर वह समाधान चुनना जो सबसे उपयुक्त हो।

जबकि पायथन फाइलों को पढ़ने की प्रक्रिया को बहुत सरल करता है, फिर भी यह कई बार मुश्किल हो सकता है, इस मामले में मैं आपको एक नज़र डालने की सलाह दूंगा आधिकारिक पायथन प्रलेखन अधिक जानकारी के लिए.

समय टिकट:

से अधिक स्टैकब्यूज