मैंने देखा है कि अगर मैं एक फ़ाइल को फिर से खोलता हूं जिसे मैंने खोला है, तो इसे "पढ़ने" के बिना इसे फिर से शुरू करना बहुत तेज़ है।

अर्थात।

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() बड़े डेटा पर कितना धीमा हो सकता है - मैं इसे फिर से उपयोग करने की कल्पना नहीं कर सकता।

40
Maverick Meerkat 29 जून 2016, 19:39
4
कृपया स्पष्ट करें। read के लिए timeit माप है, या readlines के लिए? मुझे उम्मीद है कि read लूप में अधिक समय लगेगा क्योंकि यह एक सिंगल स्ट्रिंग देता है, इसलिए इस पर पुनरावृति करना चरित्र-दर-चरित्र होगा। यदि आपकी फ़ाइल में प्रति पंक्ति औसतन 100 वर्ण हैं, तो for line in l.read() लूप में कोड, for line in l: लूप के कोड से सौ गुना अधिक बार निष्पादित होगा।
 – 
Kevin
29 जून 2016, 19:43
1
यह रीडलाइन() के लिए भी है। आश्चर्यजनक रूप से पढ़ने () या रीडलाइन () के बीच लगभग कोई समय अंतर नहीं है ...
 – 
Maverick Meerkat
29 जून 2016, 21:07

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 में काम नहीं करता है, और शायद एक संदिग्ध अभ्यास है, इसलिए यह दावा हटा दिया गया है।

34
LeopardShark 17 अप्रैल 2021, 08:39
2
फ़ाइल पर readline को for लूप के साथ मिलाना वास्तव में काम नहीं करता है; readline, next कार्यान्वयन की बफरिंग को नहीं समझता है। यदि आप किसी पंक्ति को for लूप में छोड़ना चाहते हैं, तो आपको फ़ाइल पर next पर कॉल करना चाहिए।
 – 
user2357112 supports Monica
29 जून 2016, 19:55
मैंने अभी परीक्षण किया है कि अजगर 3.4 के साथ। रीडलाइन() लूपिंग बफर को आगे ले जाने के लिए प्रतीत होता है। मुझे अजगर 2 की बहुत जल्दी जांच करने दें
 – 
Checkmate
29 जून 2016, 20:00
आह, आप अजगर 2.7 के लिए सही हैं। मैं अपना जवाब संपादित करूंगा। धन्यवाद, यह जानना अच्छा है!
 – 
Checkmate
29 जून 2016, 20:02
क्या आप एक उदाहरण दे सकते हैं जहां कोई वास्तव में पढ़ने() का उपयोग करेगा? केवल एक ही मैं सोच सकता हूं कि यदि आप किसी फ़ाइल में पासवर्ड संग्रहीत करते हैं और आप इसे पढ़ना चाहते हैं - तो .read() का उपयोग करना फ़ाइल कोड में l की तुलना में थोड़ा तेज़ होगा। लेकिन किसी भी सामान्य आकार की फाइल के लिए...?
 – 
Maverick Meerkat
29 जून 2016, 21:15
जोड़ा गया। क्या वह उदाहरण आपके प्रश्न को स्पष्ट करने में मदद करता है? यदि आवश्यक हो तो मैं और अधिक आधारभूत उदाहरण दे सकता हूं।
 – 
Checkmate
29 जून 2016, 21:24

उम्मीद है ये मदद करेगा!

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
2
Rudi 29 जून 2016, 20:59
यह सी या पायथन के लिए एपीआई का सटीक विवरण नहीं है।
 – 
user2357112 supports Monica
29 जून 2016, 19:53
मुझे लगा कि मैं इसे बहुत अच्छी तरह से नहीं समझाऊंगा, इसलिए मैंने अपना शेष उत्तर सीधे दस्तावेज़ीकरण से खींच लिया।
 – 
Rudi
29 जून 2016, 19:54
सी फाइलों को लाइन दर लाइन पढ़ने के लिए डिफ़ॉल्ट नहीं है। सी में लाइन दर लाइन पढ़ने के लिए कोई मानक फ़ंक्शन भी नहीं है; getline एक पॉज़िक्स एक्सटेंशन है। साथ ही, f.read() पर लूप प्रत्येक पुनरावृत्ति पर पूरी फ़ाइल को नहीं पढ़ता है, और यह लाइनों पर पुनरावृति नहीं करता है।
 – 
user2357112 supports Monica
29 जून 2016, 20:01
मैं गेटलाइन की बात नहीं कर रहा था, बल्कि fscanf की।
 – 
Rudi
29 जून 2016, 20:21
यह पिछले साल हुआ था जब मैंने CS108 लिया था, यह सुनिश्चित नहीं था कि यह कब बदल गया, लेकिन मैं इस पर गौर करना सुनिश्चित करूंगा।
 – 
Rudi
29 जून 2016, 20:27

इस्सकेटिट

वह शानदार जवाब था। / कुछ अच्छी बात यह है कि जब भी आप रीडलाइन () फ़ंक्शन का उपयोग करते हैं तो यह एक लाइन पढ़ता है ..... और फिर इसे फिर से पढ़ने में सक्षम नहीं होगा। आप seek() फ़ंक्शन का उपयोग करके स्थिति में वापस आ सकते हैं। शून्य स्थिति पर वापस जाने के लिए बस f.seek(0) टाइप करें।

इसी तरह, फ़ंक्शन f.tell() आपको बताएगा कि आप किस स्थिति में हैं।

-4
cezar 14 मई 2018, 17:13

ध्यान दें कि 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() को पसंद करूंगा।

0
Shayan Amani 29 सितंबर 2020, 18:27

readlines() for line in file से बेहतर है जब आप जानते हैं कि जिस डेटा में आपकी रुचि है, वह शुरू होता है, उदाहरण के लिए, दूसरी पंक्ति। आप बस readlines()[1:] लिख सकते हैं।

ऐसे उपयोग के मामले तब होते हैं जब आपके पास एक टैब/अल्पविराम से अलग की गई मान फ़ाइल होती है और पहली पंक्ति एक हेडर होती है (और आप tsv या csv फ़ाइलों के लिए अतिरिक्त मॉड्यूल का उपयोग नहीं करना चाहते हैं)।

0
Fibo Kowalsky 22 अगस्त 2021, 09:59
मुझे लगता है कि आप रीडलाइन() को रीडलाइन() से भ्रमित कर रहे हैं? यह भी सुनिश्चित है कि यह ऑब्जेक्ट इंडेक्सेबल पोस्ट पायथन -3 नहीं है
 – 
jon_simon
19 अगस्त 2021, 09:55
आप सही कह रहे हैं, मैंने readline -> readlines बदल दिया है
 – 
Fibo Kowalsky
22 अगस्त 2021, 10:00
#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
0
Akshat Nerella 1 पद 2021, 20:41