2010-08-22 10 views
23

"Python 3'e Dive" yazısını okudum "readlines() yöntemi şimdi bir yineleyici döndürüyor, bu yüzden xreadlines() Python 2'de olduğu kadar verimli." Bakınız: http://diveintopython3.org/porting-code-to-python-3-with-2to3.html. Bunun doğru olduğundan emin değilim çünkü burada bahsetmiyorlar: http://docs.python.org/release/3.0.1/whatsnew/3.0.html. Bunu nasıl kontrol edebilirim? readlines yöntem Python 3'te bir yineleyici döndürmezOkuyucular() Python 3'te bir liste veya bir yineleyici döndürüyor mu?

cevap

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

, bu

Help on built-in function readlines: 

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

sadece interaktif oturumdan diyoruz, kontrol etmek listemizi döndürür - oldukça bir yineleyici yerine, bir liste döndürür: Bu durumda Python'a dalmak yanlış görünüyor gibi görünmektedir. dosya nesneleri kendi yineleyicinızı olunca


xreadlines

deprecated since Python 2.3 olmuştur. xreadlines aynı verimi almanın yolu kullanmak yerine ise

for line in f.xreadlines(): 

you should use simply

for line in f: 

Bu size istediğiniz yineleyici alır ve readlines değiştirmeye gerek yoktu açıklamaya yardımcı olmaktadır onun Python 3'teki davranış - yinelemeli yaklaşımı veren line in f deyimiyle tam bir listeye dönebilir ve uzun zamandır belirtilen xreadlines tamamen kaldırılmıştır. Bunun gibi

+0

Ben bekleneceği f.xreadlines kuyruk için 'kullanıyordum herkes() : 'yıl önce f: 'için satırına çevirdi. –

+0

@John Machin: Ben de öyle umuyorum (belki de beklemeyin!) Python 2'de bunu yapmak için xreadlines'ın tercih edilen yol olduğunu ima etmeyi istemedim - Python 2.3'te geri dönüşü engellenmişti. dosya-yineleyici yöntemi tanıtıldı. Sadece Python 3'te kaldırılabilmesinin nedenini vermek istedim. –

+2

Sadece bir hafta önce kendi dosyalarının kendi yineleyicileri olduğunu keşfettim :(Bu, 1.5'den beri öğretici/sürüm notlarına bakmama yardım ediyor sanırım. – wbg

7

Diğerleri zaten kadar söylediler, ama sadece de önemini vurgulamak için, sıradan dosya nesneleri kendi yineleyiciler bulunmaktadır. Yani, readlines() bir yineleyiciye geri dönmek aptalca olacaktır, çünkü sadece aradığınız dosyayı döndürecektir. Scott söylediğin gibi, bir dosyaya yineleme yapmak için bir for döngü kullanabilir ve aynı zamanda itertools işlevlerine düz onları geçirebilirsiniz:

from itertools import islice 
f = open('myfile.txt') 
oddlines = islice(f, 0, None, 2) 
firstfiveodd = islice(oddlines, 5) 
for line in firstfiveodd: 
    print(line) 
İlgili konular