मैंने देखा है कि अगर मैं एक फ़ाइल को फिर से खोलता हूं जिसे मैंने खोला है, तो इसे "पढ़ने" के बिना इसे फिर से शुरू करना बहुत तेज़ है।
अर्थात।
l = open('file','r')
for line in l:
pass (or code)
की तुलना में बहुत तेज है
l = open('file','r')
for line in l.read() / l.readlines():
pass (or code)
दूसरा लूप लगभग 1.5x जितना अधिक समय लेगा (मैंने उसी फ़ाइल पर टाइमिट का उपयोग किया था, और परिणाम 0.442 बनाम 0.660 थे), और वही परिणाम देगा।
तो - मुझे कभी भी .read() या .readlines() का उपयोग कब करना चाहिए?
चूंकि मुझे हमेशा उस फ़ाइल पर पुनरावृति करने की आवश्यकता होती है जिसे मैं पढ़ रहा हूं, और कठिन तरीके से सीखने के बाद .read() बड़े डेटा पर कितना धीमा हो सकता है - मैं इसे फिर से उपयोग करने की कल्पना नहीं कर सकता।
6 जवाब
आपके प्रश्न का संक्षिप्त उत्तर यह है कि फ़ाइल के बिट्स को पढ़ने के इन तीन तरीकों में से प्रत्येक के अलग-अलग उपयोग के मामले हैं। जैसा कि ऊपर उल्लेख किया गया है, f.read()
फ़ाइल को एक व्यक्तिगत स्ट्रिंग के रूप में पढ़ता है, और इसलिए फ़ाइल-व्यापी रेगेक्स खोज या प्रतिस्थापन जैसे अपेक्षाकृत आसान फ़ाइल-व्यापी जोड़तोड़ की अनुमति देता है।
f.readline()
फ़ाइल की एक पंक्ति को पढ़ता है, जिससे उपयोगकर्ता पूरी फ़ाइल को आवश्यक रूप से पढ़े बिना एक पंक्ति को पार्स कर सकता है। f.readline()
का उपयोग करने से फ़ाइल को पढ़ने में तर्क के आसान अनुप्रयोग की अनुमति मिलती है, जैसे कि जब कोई फ़ाइल आंशिक रूप से प्रारूप में परिवर्तन करती है।
वाक्य रचना for line in f:
का उपयोग करने से उपयोगकर्ता को फ़ाइल लाइन पर लाइन दर लाइन पुनरावृति करने की अनुमति मिलती है जैसा कि प्रश्न में उल्लेख किया गया है।
(जैसा कि दूसरे उत्तर में बताया गया है, यह दस्तावेज़ीकरण एक बहुत अच्छा पढ़ा गया है):
https://docs.python.org/3/tutorial/inputoutput.html#methods-of-file-objects
ध्यान दें: पहले यह दावा किया गया था कि लूप पुनरावृत्ति के दौरान f.readline()
का उपयोग किसी लाइन को स्किप करने के लिए किया जा सकता है। हालांकि, यह पायथन 2.7 में काम नहीं करता है, और शायद एक संदिग्ध अभ्यास है, इसलिए यह दावा हटा दिया गया है।
readline
को for
लूप के साथ मिलाना वास्तव में काम नहीं करता है; readline
, next
कार्यान्वयन की बफरिंग को नहीं समझता है। यदि आप किसी पंक्ति को for
लूप में छोड़ना चाहते हैं, तो आपको फ़ाइल पर next
पर कॉल करना चाहिए।
उम्मीद है ये मदद करेगा!
https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects
जब आकार छोड़ा जाता है या नकारात्मक होता है, तो फ़ाइल की संपूर्ण सामग्री को पढ़ा और लौटाया जाएगा; यदि फ़ाइल आपकी मशीन की मेमोरी से दोगुनी बड़ी है तो यह आपकी समस्या है
सभी संपादनों के लिए क्षमा करें!
किसी फ़ाइल से पंक्तियाँ पढ़ने के लिए, आप फ़ाइल ऑब्जेक्ट पर लूप कर सकते हैं। यह स्मृति कुशल, तेज है, और सरल कोड की ओर जाता है:
for line in f:
print line,
This is the first line of the file.
Second line of the file
getline
एक पॉज़िक्स एक्सटेंशन है। साथ ही, f.read()
पर लूप प्रत्येक पुनरावृत्ति पर पूरी फ़ाइल को नहीं पढ़ता है, और यह लाइनों पर पुनरावृति नहीं करता है।
इस्सकेटिट
वह शानदार जवाब था। / कुछ अच्छी बात यह है कि जब भी आप रीडलाइन () फ़ंक्शन का उपयोग करते हैं तो यह एक लाइन पढ़ता है ..... और फिर इसे फिर से पढ़ने में सक्षम नहीं होगा। आप seek()
फ़ंक्शन का उपयोग करके स्थिति में वापस आ सकते हैं। शून्य स्थिति पर वापस जाने के लिए बस f.seek(0)
टाइप करें।
इसी तरह, फ़ंक्शन f.tell()
आपको बताएगा कि आप किस स्थिति में हैं।
ध्यान दें कि readline()
फॉर-लूप में सभी लाइनों को पढ़ने के मामले में तुलनीय नहीं है क्योंकि यह लाइन से लाइन पढ़ता है और एक ओवरहेड है जो पहले से ही दूसरों द्वारा इंगित किया गया है।
मैं दो समान अंशों पर timeit
दौड़ा लेकिन एक फॉर-लूप के साथ और दूसरा readlines()
के साथ। आप मेरा स्निपेट नीचे देख सकते हैं:
def test_read_file_1():
f = open('ml/README.md', 'r')
for line in f.readlines():
print(line)
def test_read_file_2():
f = open('ml/README.md', 'r')
for line in f:
print(line)
def test_time_read_file():
from timeit import timeit
duration_1 = timeit(lambda: test_read_file_1(), number=1000000)
duration_2 = timeit(lambda: test_read_file_2(), number=1000000)
print('duration using readlines():', duration_1)
print('duration using for-loop:', duration_2)
और परिणाम:
duration using readlines(): 78.826229238
duration using for-loop: 69.487692794
नीचे की रेखा, मैं कहूंगा, फॉर-लूप तेज है लेकिन दोनों की संभावना के मामले में, मैं readlines()
को पसंद करूंगा।
readlines()
for line in file
से बेहतर है जब आप जानते हैं कि जिस डेटा में आपकी रुचि है, वह शुरू होता है, उदाहरण के लिए, दूसरी पंक्ति। आप बस readlines()[1:]
लिख सकते हैं।
ऐसे उपयोग के मामले तब होते हैं जब आपके पास एक टैब/अल्पविराम से अलग की गई मान फ़ाइल होती है और पहली पंक्ति एक हेडर होती है (और आप tsv या csv फ़ाइलों के लिए अतिरिक्त मॉड्यूल का उपयोग नहीं करना चाहते हैं)।
readline
-> readlines
बदल दिया है
#The difference between file.read(), file.readline(), file.readlines()
file = open('samplefile', 'r')
single_string = file.read() #Reads all the elements of the file
#into a single string(\n characters might be included)
line = file.readline() #Reads the current line where the cursor as a string
#is positioned and moves to the next line
list_strings = file.readlines()#Makes a list of strings
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।
read
के लिएtimeit
माप है, याreadlines
के लिए? मुझे उम्मीद है किread
लूप में अधिक समय लगेगा क्योंकि यह एक सिंगल स्ट्रिंग देता है, इसलिए इस पर पुनरावृति करना चरित्र-दर-चरित्र होगा। यदि आपकी फ़ाइल में प्रति पंक्ति औसतन 100 वर्ण हैं, तोfor line in l.read()
लूप में कोड,for line in l:
लूप के कोड से सौ गुना अधिक बार निष्पादित होगा।