2016-09-13 3 views
0

ich verwende os.scandir für das Erhalten der Liste der Dateien in einem Ordner:Zugang erstes Element in einem os.scandir

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

Ich mag das erste Element erhalten.

Ich versuche 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' 

ich also versucht:

>>> 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'> 
>>> 

So wie in der Liste wir das erste Element Wert bekommen, können wir es von os.scandir bekommen?

+0

Zusätzlich zu den Antworten finden Sie hier die Dokumentation für Iterator in Python 3: https://docs.python.org/3/library/stdtypes.html#iterator-types. Es besagt, dass Iteratoren nur die "magischen" Funktionen '__iter__' und' __next__' haben. –

Antwort

1

os.scandir() gibt einen Iterator die Verzeichniseinträge für einen bestimmten Pfad enthält, sehen help(os.scandir):

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

einen Wert zu erhalten Rufen Sie das eingebaute next darauf:

next(img_list2) 

Dadurch werden Werte vom Iterator zurückgegeben, bis er erschöpft ist (und StopIteration wird ausgelöst).

Sie können es auch in einen list Anruf umschließen, der einen list von allen Einträgen erstellt und es indexierbar macht, aber wenn Sie nur das erste Element benötigen, das übertrieben ist.

iterator.next() wurde ab Python 3.0 mit PEP 3114 entfernt; ein dunder iterator.__next__() Methode ersetzt es zusammen mit der eingebauten next(), die es ruft.

+0

Wie man eine Liste mit indexierbaren Einträgen erstellt –

+0

müssen Sie unbedingt 'img_list2' in' list() 'übergeben und dann können Sie es indizieren, d. H.' Img_list3 = list (img_list2) '. –

+0

Auch im jinja2-Code meines Django-Projekts habe ich versucht, next (img_list2) .path zu verwenden. Es heißt Fehler 'django.template.exceptions.TemplateSyntaxError: Der Rest konnte nicht analysiert werden: '(img_list2) .path' from 'next (img_list2) .path' [13/Sep/2016 23:21:38]" GET/gallery/HTTP/1.1 "500 130929 ' –

1

next() würden Sie das nächste Element aus dem img_list2 Iterator:

next(img_list2)