2016-09-13 70 views
0

我使用os.scandir用於獲取文件夾中的文件列表:訪問第一個元素在os.scandir

img_list2 = os.scandir('/home/shared/test') 

我想要得到的第一個元素。

我想img_list2.next()

>>> img_list2.next() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'posix.ScandirIterator' object has no attribute 'next' 

所以,我想:

>>> filt = list(img_list2) 
>>> type(filt) 
<class 'list'> 
>>> globals()['filt'] 
[<DirEntry 'panaroma00010.jpg'>, <DirEntry 'panaroma00014.jpg'>, <DirEntry 'panaroma00004.jpg'>, <DirEntry 'panaroma00013.jpg'>, <DirEntry 'panaroma00007.jpg'>, <DirEntry 'panaroma00011.jpg'>, <DirEntry 'panaroma00012.jpg'>, <DirEntry 'panaroma00006.jpg'>, <DirEntry 'panaroma00009.jpg'>, <DirEntry 'panaroma00001.jpg'>, <DirEntry 'panaroma00003.jpg'>, <DirEntry 'panaroma00005.jpg'>, <DirEntry 'panaroma00002.jpg'>, <DirEntry 'panaroma00008.jpg'>] 
>>> filt[1] 
<DirEntry 'panaroma00014.jpg'> 
>>> 

所以就像在列表中,我們可以得到的第一個元素的值,我們可以從os.scandir怎麼做呢?

+0

除了下面的答案,這裏是在Python 3迭代器的文檔:https://docs.python.org/3/library/stdtypes.html#iterator-types。它說迭代器只有'魔術'函數'__iter__'和'__next__'。 –

回答

1

os.scandir()返回包含給定路徑的目錄項的迭代器,看到help(os.scandir)

scandir(...) 
    scandir(path='.') -> iterator of DirEntry objects for given path 

爲了得到一個值從中調用其內置next

next(img_list2) 

直到它耗盡(和StopIteration升高),這將從迭代器返回值。

你也可以在list調用中包裝它,它會在所有條目中創建一個list,並使其成爲可索引的,但是如果你只需要第一個過度殺傷的元素。

iterator.next()Python 3.0移除PEP 3114;一個dunder iterator.__next__()方法將其與內置的next()一起替換爲它。

+0

如何使可索引條目列表 –

+0

你不一定必須通過'img_list2'在'名單()'然後就可以建立索引,即'img_list3 =名單(img_list2)'。 –

+0

同樣在我的django項目的jinja2代碼中,我嘗試使用next(img_list2).path。其說錯誤'django.template.exceptions.TemplateSyntaxError:無法解析餘數爲:從 '下一個(img_list2)。路徑' '(img_list2)。路徑' [13 /月/ 2016 23時21分38秒]「GET/gallery/HTTP/1.1「500 130929 ' –

1

next()會給你下一個項目從img_list2迭代器:

next(img_list2) 
相關問題