лучший способ получить список файлов большой директории на python? - PullRequest
12 голосов
/ 25 февраля 2011

У меня безумный большой каталог.Мне нужно получить список файлов через Python.

В коде мне нужно получить итератор, а не список.Так что это не работает:

os.listdir
glob.glob  (uses listdir!)
os.walk

Я не могу найти хорошую библиотеку.Помогите!Может быть, c ++ lib?

Ответы [ 7 ]

9 голосов
/ 21 января 2016

для питона 2.X

import scandir
scandir.walk()

для питона 3.5 +

os.scandir()

https://www.python.org/dev/peps/pep-0471/

https://pypi.python.org/pypi/scandir

8 голосов
/ 11 августа 2011

Если у вас есть каталог, который слишком велик, чтобы libc readdir () мог быстро его прочитать, вы, вероятно, захотите взглянуть на вызов ядра getdents () (http://www.kernel.org/doc/man-pages/online/pages/man2/getdents.2.html).Я столкнулся с подобной проблемой и написал об этом длинный пост в блоге.

http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with-ls/

По сути, readdir () считывает только 32 КБ записей каталога за раз, и поэтому, еслимного файлов в каталоге, readdir () займет очень много времени.

0 голосов
/ 05 декабря 2013

Как насчет glob.iglob? Это глобус итератора.

0 голосов
/ 01 августа 2013

Я нашел эту библиотеку полезной: https://github.com/benhoyt/scandir.

0 голосов
/ 07 июня 2013

Вы должны использовать генератор. Эта проблема обсуждается здесь: http://bugs.python.org/issue11406

0 голосов
/ 25 февраля 2011

http://docs.python.org/release/2.6.5/library/os.html#os.walk

>>> import os
>>> type(os.walk('/'))
<type 'generator'>
0 голосов
/ 25 февраля 2011

Я думаю, что использование opendir будет работать, и есть пакет python: http://pypi.python.org/pypi/opendir/0.0.1, который оборачивает его через pyrex

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...