2010-08-22 10 views
23

मैंने "पाइथन 3 में डाइव" में पढ़ा है कि "रीडलाइन() विधि अब एक पुनरावर्तक लौटाती है, इसलिए यह उतना ही कुशल है जितना xreadlines() पायथन 2 में था"। यहां देखें: http://diveintopython3.org/porting-code-to-python-3-with-2to3.html। मुझे यकीन नहीं है कि यह सच है क्योंकि वे इसका उल्लेख यहां नहीं करते हैं: http://docs.python.org/release/3.0.1/whatsnew/3.0.html। मैं इसे कैसे देख सकता हूं?क्या रीडलाइन() पाइथन 3 में एक सूची या एक पुनरावर्तक लौटाता है?

उत्तर

17
इस तरह

:

Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> f = open('/junk/so/foo.txt') 
>>> type(f.readlines()) 
<class 'list'> 
>>> help(f.readlines) 
Help on built-in function readlines: 

readlines(...) 
    Return a list of lines from the stream. 

    hint can be specified to control the number of lines read: no more 
    lines will be read if the total size (in bytes/characters) of all 
    lines so far exceeds hint. 

>>> 
24

readlines विधि पायथन 3 में एक इटरेटर वापस नहीं करता है, यह एक सूची

Help on built-in function readlines: 

readlines(...) 
    Return a list of lines from the stream. 

जाँच के लिए, बस एक इंटरैक्टिव सत्र से इसे कहते रिटर्न - यह एक सूची प्रदान करेगा, बल्कि एक इटरेटर से:

>>> type(f.readlines()) 
<class 'list'> 

पायथन में गोताखोरी इस मामले में गलत प्रतीत होती है।


xreadlinesdeprecated since Python 2.3 किया गया है जब फ़ाइल वस्तुओं को अपने स्वयं के iterators बन गया। जिस तरह से xreadlines रूप में एक ही दक्षता प्राप्त करने के लिए उपयोग करने के बजाय है

for line in f.xreadlines(): 

you should use simply

for line in f: 

यह आपको इटरेटर जो आप चाहते हो जाता है, और समझाने के लिए क्यों readlines को बदलने की जरूरत नहीं की थी मदद करता है अपने पायथन 3 में व्यवहार - यह अभी भी एक पूर्ण सूची लौटा सकता है, line in f बेवकूफ दृष्टिकोण प्रदान करने वाला idiom, और लंबे समय से बहिष्कृत xreadlines पूरी तरह से हटा दिया गया है।

+0

मैं उम्मीद होती है कि किसी को भी f.xreadlines में लाइन के लिए 'जो उपयोग कर रहा था() : 'साल पहले एफ में लाइन के लिए इसे बदल दिया जाएगा। –

+0

@ जॉन माचिन: ​​मुझे भी उम्मीद है (हालांकि शायद इसकी उम्मीद नहीं है!) मेरा मतलब यह नहीं था कि 'xreadlines' पायथन 2 में ऐसा करने का पसंदीदा तरीका था - इसे पायथन 2.3 में वापस हटा दिया गया था फाइल-ए-इटरेटर विधि पेश की गई थी। मैं सिर्फ कारण था कि इसे पायथन 3 में हटाया जा सकता है। –

+2

मैंने केवल एक सप्ताह पहले फाइलों को अपने स्वयं के इटेटरेटर्स की खोज की थी :(मुझे लगता है कि 1.5 के बाद से ट्यूटोरियल/रिलीज नोट्स को देखने के लिए मुझे सही काम नहीं करता है। – wbg

7

दूसरों को पहले से ही जितना कहा है, लेकिन सिर्फ बिंदु घर ड्राइव करने के लिए, साधारण फ़ाइल की वस्तुओं के लिए अपने स्वयं iterators हैं। तो readlines() वापस एक इटेटरेटर मूर्खतापूर्ण होगा, क्योंकि यह उस फ़ाइल को वापस कर देगा जिसे आपने इसे बुलाया था। आप एक फ़ाइल पर पुनरावृति करने के लिए एक for पाश का उपयोग कर सकते है जैसे स्कॉट ने कहा, और आप भी उन्हें सीधे itertools कार्यों के लिए पारित कर सकते हैं:

from itertools import islice 
f = open('myfile.txt') 
oddlines = islice(f, 0, None, 2) 
firstfiveodd = islice(oddlines, 5) 
for line in firstfiveodd: 
    print(line) 
संबंधित मुद्दे