किसी फ़ाइल से विशिष्ट पंक्तियाँ कुशलतापूर्वक पढ़ना कई पाइथन प्रोग्रामों के लिए महत्वपूर्ण है। इष्टतम तरीका फ़ाइल के आकार और आपको उन पंक्तियों तक कितनी बार पहुँचने की आवश्यकता है, इस पर बहुत अधिक निर्भर करता है। यह मार्गदर्शिका कई विधियों का पता लगाती है, जिनमें से प्रत्येक अलग-अलग परिदृश्यों के लिए तैयार है।
विषयसूची
- छोटी फ़ाइलों से विशिष्ट पंक्तियाँ पढ़ना
- पंक्तियों को कई बार कुशलतापूर्वक एक्सेस करना
- बड़ी फ़ाइलों को कुशलतापूर्वक संभालना
- विशाल डेटासेट के लिए उन्नत तकनीकें
- अक्सर पूछे जाने वाले प्रश्न
छोटी फ़ाइलों से विशिष्ट पंक्तियाँ पढ़ना
छोटी फ़ाइलों के लिए जो आराम से मेमोरी में फिट हो जाती हैं, readlines()
विधि एक सरल समाधान प्रदान करती है। यह विधि सभी पंक्तियों को एक सूची में पढ़ती है, जिससे अनुक्रमणिका के माध्यम से सीधी पहुँच संभव होती है।
def read_specific_lines_small_file(filepath, line_numbers):
"""एक छोटी फ़ाइल से विशिष्ट पंक्तियाँ पढ़ता है।
Args:
filepath: फ़ाइल का पथ।
line_numbers: पढ़ने के लिए पंक्ति संख्याओं की एक सूची (0-आधारित अनुक्रमणिका)।
Returns:
स्ट्रिंग्स की एक सूची, जिसमें अनुरोधित पंक्तियाँ होती हैं। यदि फ़ाइल नहीं मिलती है तो एक खाली सूची देता है।
"""
try:
with open(filepath, 'r') as file:
lines = file.readlines()
return [lines[i].strip() for i in line_numbers if 0 <= i < len(lines)]
except FileNotFoundError:
return []
filepath = "my_small_file.txt"
line_numbers_to_read = [0, 2, 4] # पंक्ति 1, 3, और 5 पढ़ें (0-आधारित अनुक्रमणिका)
lines = read_specific_lines_small_file(filepath, line_numbers_to_read)
for line in lines:
print(line)
हालांकि सीधा-सादा है, यह तरीका बड़ी फ़ाइलों के लिए अकुशल हो जाता है।
पंक्तियों को कई बार कुशलतापूर्वक एक्सेस करना
यदि आप बार-बार समान पंक्तियों तक पहुँचते हैं, तो linecache
मॉड्यूल डिस्क I/O को कम करके, पंक्तियों को कैश करके महत्वपूर्ण प्रदर्शन लाभ प्रदान करता है।
import linecache
def read_specific_lines_linecache(filepath, line_numbers):
"""linecache का उपयोग करके विशिष्ट पंक्तियाँ पढ़ता है (1-आधारित अनुक्रमणिका)।
Args:
filepath: फ़ाइल का पथ।
line_numbers: पढ़ने के लिए पंक्ति संख्याओं की एक सूची (1-आधारित अनुक्रमणिका)।
Returns:
स्ट्रिंग्स की एक सूची, जिसमें अनुरोधित पंक्तियाँ होती हैं। यदि फ़ाइल नहीं मिलती है या पंक्तियाँ सीमा से बाहर हैं तो एक खाली सूची देता है।
"""
lines = [linecache.getline(filepath, line_number).strip() for line_number in line_numbers if linecache.getline(filepath, line_number)]
return lines
filepath = "my_file.txt"
line_numbers_to_read = [1, 3, 5] # पंक्ति 1, 3, और 5 पढ़ें (1-आधारित अनुक्रमणिका)
lines = read_specific_lines_linecache(filepath, line_numbers_to_read)
for line in lines:
print(line)
ध्यान दें कि linecache
1-आधारित अनुक्रमणिका का उपयोग करता है।
बड़ी फ़ाइलों को कुशलतापूर्वक संभालना
बड़ी फ़ाइलों के लिए, सब कुछ मेमोरी में लोड करने से बचें। पंक्ति संख्याओं को ट्रैक करने के लिए enumerate()
का उपयोग करके पंक्ति दर पंक्ति पुनरावृति करें।
def read_specific_lines_large_file(filepath, line_numbers):
"""एक बड़ी फ़ाइल से कुशलतापूर्वक विशिष्ट पंक्तियाँ पढ़ता है।
Args:
filepath: फ़ाइल का पथ।
line_numbers: पढ़ने के लिए पंक्ति संख्याओं की एक सूची (0-आधारित अनुक्रमणिका)।
Returns:
स्ट्रिंग्स की एक सूची, जिसमें अनुरोधित पंक्तियाँ होती हैं। यदि फ़ाइल नहीं मिलती है तो एक खाली सूची देता है।
"""
try:
lines_to_return = []
with open(filepath, 'r') as file:
for i, line in enumerate(file):
if i in line_numbers:
lines_to_return.append(line.strip())
return lines_to_return
except FileNotFoundError:
return []
filepath = "my_large_file.txt"
line_numbers_to_read = [100, 500, 1000] # पंक्ति 101, 501, और 1001 पढ़ें (0-आधारित अनुक्रमणिका)
lines = read_specific_lines_large_file(filepath, line_numbers_to_read)
for line in lines:
print(line)
यह विधि पर्याप्त फ़ाइलों के लिए मेमोरी-कुशल है।
विशाल डेटासेट के लिए उन्नत तकनीकें
उपलब्ध RAM से अधिक बड़ी फ़ाइलों के लिए, मेमोरी-मैप की गई फ़ाइलों या dask
या vaex
जैसी विशेष पुस्तकालयों पर विचार करें, जो उन डेटासेट को संभालने के लिए डिज़ाइन किए गए हैं जो मेमोरी में फिट नहीं होते हैं।
अक्सर पूछे जाने वाले प्रश्न
- प्रश्न: क्या होगा यदि पंक्ति संख्या सीमा से बाहर है? प्रदान की गई विधियाँ सीमा से बाहर की पंक्ति संख्याओं को केवल उन्हें छोड़कर कुशलतापूर्वक संभालती हैं।
- प्रश्न: क्या मैं पंक्ति संख्या के बजाय किसी शर्त के आधार पर पंक्तियाँ पढ़ सकता हूँ? हाँ, पंक्ति संख्या जांच को एक सशर्त कथन से बदलें (जैसे,
if "keyword" in line:
)।