Более быстрый способ получить список каталогов, чем вызов "ls" в подпроцессе - PullRequest
1 голос
/ 27 июля 2011

После поиска и некоторых тестов os.popen () + read () и subprocess.check_output () кажутся почти эквивалентными для считывания содержимого папки. Есть ли способ улучшить комбинацию os.popen () + read () или subprocess.check_output ()? Я должен ls количество папок и прочитать выходные данные, и использование любого из вышеперечисленных аналогично, но представляет собой основное узкое место в соответствии с результатами профилирования.

Ответы [ 3 ]

5 голосов
/ 27 июля 2011

Вы ищете os.listdir и / или os.walk и, возможно, также семейство функций os.stat .Это (привязки Python) к тем же примитивам, которые использует ls, так что все, что вы можете сделать, проанализировав вывод ls, вы можете сделать с ними.Я рекомендую внимательно прочитать все, что предлагают модули os , os.path и stat ;могут быть и другие вещи, которые вам не нужны для внешней программы.

Возможно, вам также следует прочитать документацию по stat, базовому системному вызову - он ориентирован на C, но это поможет вам понять, что делает os.stat.

2 голосов
/ 27 июля 2011

Почему бы вам просто не прочитать содержимое каталога напрямую с помощью os.listdir?Зачем вам раскошелиться на ls?Если вам нужна дополнительная информация о файлах помимо имен файлов, вы также можете использовать os.stat.Гораздо эффективнее делать системные вызовы самостоятельно, чем создавать подпроцессы, которые делают это за вас.

Для полного обхода каталога существует os.walkМодуль shutil также имеет несколько полезных функций.

0 голосов
/ 27 июля 2011

Используйте glob:

>>> from glob import glob
>>> glob('*')

Синтаксис тот же.

Например

glob('*.txt')  # the same as "ls *.txt"
...