Как мне получить список всех файлов (и каталогов) в данном каталоге в Python?
Это способ просмотреть каждый файл и каталог в дерево каталогов:
import os for dirname, dirnames, filenames in os.walk ('.'): # сначала вывести путь ко всем подкаталогам. for subdirname в dirnames: print (os.path.join (dirname, subdirname)) # распечатать путь ко всем именам файлов. для имени файла в именах файлов: print (os.path.join (dirname, filename)) # Расширенное использование: # редактирование списка 'dirnames' остановит повторное использование os.walk () туда. если '.git' в dirnames: # не заходите ни в какие каталоги .git. dirnames.remove ('. git')
Вы можете использовать
os.listdir (path)
Для справки и других функций ОС смотрите здесь :
- Документы Python 2: https://docs.python.org/2/library/os.html#os.listdir
- Python 3 документа: https://docs.python.org/3/library/os.html#os.listdir
-
1мы Все исходные вопросы достаточно расплывчаты, чтобы не знать, хотят ли они рекурсивного решения. «все файлы в каталоге» можно интерпретировать как рекурсивный. – Томми 10 дек. ’15 в 2:01
-
3@Tommy, «каталог» – это четко определенная структура данных, и она ссылается на «ls», а не на «ls -R». Кроме того, почти все инструменты UNIX по умолчанию не работают рекурсивно. Я не знаю, что спрашивающий имел в виду , но то, что он написал , было ясно. – Торстен Бронгер 06 июля ’16 в 13:19
-
Однако документы python 3 советуют вам использовать
os.scandir
, поскольку во многих случаях он позволяет предотвращать системные вызовы, обеспечивая бесплатное ускорение (как IPC, так и IO медленные). – Джеппи Керк, 14 апр. ’17 в 9:54 -
7listdir дает вам единственное имя файла в каталоге, есть ли способ получить полный путь? – greperror 03 авг. 2017, 21:04
-
1@greperror Вы можете использовать os.path.abspath для получения полного пути. Кроме того, чтобы проверить, является ли данный путь файлом, используйте os.path. isfile или
os.path.isdir
. – Александр 01 апр. ’18 в 22:10
Вы можете использовать
os.listdir (path)
Для справки и других функций ОС смотрите здесь:
- Документы Python 2: https://docs.python.org/2/library/os .html # os.listdir
- Документы Python 3: https://docs.python.org/3/library/os.html#os.listdir
Вот вспомогательная функция, которую я использую довольно часто:
import osdef listdir_fullpath (d): return [os.path.join (d, f) for f in os.listdir (d)]
-
3Генератор был бы лучше. – Роберт Симер, 11 сен. ’15 в 9:27
-
2@RobertSiemer, который зависит от использования. Во многих случаях список был бы лучше, но я думаю, что генератор более универсален, поскольку его можно преобразовать в список. Это зависит от того, что вам нужно: универсальность или что-то более рациональное. – Джеймс Мчуг, 09 авг., 20:02
-
4Прошло десять лет, но я думаю, что сделал это таким образом, потому что os.listdir () возвращает список, и я имитировал это. – giltay 14 авг. ’18 в 13:53
Вот вспомогательная функция, которую я использую довольно часто:
import osdef listdir_fullpath (d ): return [os.path.join (d, f) for f в os.listdir (d)]
импортировать osfor filename в os.listdir ("C: \ temp"): напечатать имя файла


-
17
r'C: temp '
является более понятным и предпочтительным в"C: \ temp"
Необработанные строки предпочтительнее, чем экранирование обратной косой черты. – smci 26 августа 2012 г., 2:07
import osfor имя файла в os.listdir ("C: \ temp"): напечатать имя файла
Если вам нужны возможности подстановки, для этого также есть модуль. Например:
import globglob.glob ('./[0-9 visible.*')
вернет что-то вроде:
['./1 .gif ',' ./2.txt ']
См. документацию здесь.
-
Это действительно здорово! у вас может быть отрицание в этом совпадающем выражении? нравится все, кроме файлов, соответствующих шаблону
ЭТО
? – Чарли Паркер 20 июля ’20 в 16:02
Если вам нужны возможности подстановки, для этого также есть модуль. Например:
import globglob.glob ('./[0-9]. *')
вернет что-то например:
['./1.gif', './2.txt']
См. документацию здесь .
Попробуйте следующее:
импортировать osfor top, dirs, files в os.walk ('./'): для nm в файлах: print os.path.join (top, nm)

-
В одной строке: [top + os.sep + f для top, dirs, files в os.walk (‘./’) для f в файлах ] – Дж. Петерсон, 23 апр. ’13 в 21:10
i>
Попробуйте это:
импортируйте osfor top, dirs, files в os.walk ('./'): для nm в файлах: print os.path. join (top, nm)
Для файлов в текущем рабочем каталоге без указания пути
Python 2.7:
import osos .listdir ('.')
Python 3.x:
import osos .listdir ()
Для файлов в текущем рабочем каталоге без указания пути
Python 2.7:
import osos.listdir ('.')
Python 3.x:
import osos.listdir ()
Рекурсивная реализация
import osdef scan_dir (dir): for name in os.listdir (dir): path = os.path.join (dir, name) if os.path.isfile (path): print path else: scan_dir (path)

Рекурсивная реализация
import osdef scan_dir (dir): для имени в ОС .listdir (dir): path = os.path.join (dir, name) if os.path.isfile (path): print path else: scan_dir (path)
Я написал длинную версию со всеми параметрами, которые могут мне понадобиться: http://sam.nipl.net/code/python/find.py
Думаю, здесь он тоже подойдет:
#!/usr/ bin/env pythonimport osimport sysdef ls (dir, hidden = False, relative = True): nodes = [] для nm в os.listdir (dir): если не скрыт и nm.startswith ('.'): продолжить, если не относительный : nm = os.path.join (dir, nm) nodes.append (nm) nodes.sort () return nodesdef find (root, files = True, dirs = False, hidden = False, relative = True, topdown = True) : root = os.path.join (root, '') # добавить косую черту, если ее нет для parent, ldirs, lfiles в os. walk (root, topdown = topdown): if relative: parent = parent [len (root):] if dirs и parent: yield os.path.join (parent, ''), если не скрыт: lfiles = [nm для nm в lfiles, если не nm.startswith ('.')] ldirs [:] = [nm для nm в ldirs, если не nm.startswith ('.')] # на месте, если files: lfiles.sort () для nm в lfiles: nm = os.path.join (parent, nm) yield nmdef test (root): print "* список каталогов, со скрытыми файлами:" print ls (root, hidden = True) print print "* рекурсивный листинг, с каталогами, но нет скрытых файлов: "для f в find (root, dirs = True): print f printif __name__ ==" __main__ ": test (* sys.argv [1:])
Я написал длинную версию со всеми параметрами, которые могут мне понадобиться: http://sam.nipl.net/code/python/ find.py
Думаю, он подойдет и здесь:
#!/usr/bin/env pythonimport osimport sysdef ls (dir, hidden = False, relative = True): nodes = [] для nm в os.listdir (dir): if not hidden and nm.startswith ('.'): Continue, if not relative: nm = os.path.join (dir, nm) nodes.append (nm) nodes.sort () return nodesdef find (root, files = True, dirs = False, hidden = False, relative = True, topdown = True): root = os.path.join (root, '') # добавить косую черту, если ее нет для parent, ldirs, lfiles в os.walk (root, topdown = topdown): if relative: parent = parent [len (root):] if dirs и parent: yield os.path. join (parent, ''), если не скрыт: lfiles = [nm для nm в lfiles, если не nm.startswith ('.')] ldirs [:] = [nm для nm в ldirs, если не nm.startswith ('.'. )] # на месте, если files: lfiles.sort () для nm в lfiles: nm = os.path.join (parent, nm) yield nmdef test (root): print "* список каталогов, с скрытые файлы: "print ls (root, hidden = True) print print" * рекурсивный список, с каталогами, но без скрытых файлов: "для f в find (root, dirs = True): print f printif __name__ ==" __main__ " : test (* sys.argv [1:])
Вот еще один вариант.
os.scandir (path = '.')
Он возвращает итератор объектов os.DirEntry, соответствующих записям (вместе с информацией об атрибутах файла) в каталоге, заданном путем.
Пример :
с os.scandir (path) как он: для записи в нем: если не entry.name.startswith ('.'): print (entry. name)
Использование scandir () вместо listdir () может значительно повысить производительность кода, которому также требуется информация о типе файла или атрибутах файла , потому что объекты os.DirEntry предоставляют эту информацию, если операционная система предоставляет ее при сканировании каталога. Все методы os.DirEntry могут выполнять системный вызов, но is_dir () и is_file () обычно требуют системного вызова только для символьных ссылок; os.DirEntry.stat () всегда требует системного вызова в Unix, но требует только одного для символьных ссылок в Windows.
Python Docs
Вот еще один вариант.
os.scandir (path = '.'. )
Он возвращает итератор объектов os.DirEntry, соответствующих записям (вместе с информацией об атрибутах файла) в каталоге, заданном путем.
Пример :
с os.scandir (путь) как он: для записи в нем: если not entry.name.startswith ('.'): print (entry.name)
Использование scandir () вместо listdir () может значительно повысить производительность кода, которому также нужна информация о типе файла или атрибутах файла , потому что объекты os.DirEntry предоставляют эту информацию, если операционная система предоставляет ее при сканировании каталога. Все методы os.DirEntry могут выполнять системный вызов, но is_dir () и is_file () обычно требуют системного вызова только для символьных ссылок; os.DirEntry.stat () всегда требует системного вызова в Unix, но требует только одного для символьных ссылок в Windows.
Python Docs
Хотя os.listdir ()
подходит для создания списка имена файлов и каталогов, часто вы хотите сделать больше, когда у вас есть эти имена – а в Python3 pathlib упрощает эти другие рутинные операции. Давайте посмотрим, нравится ли вам это так же, как и мне.
Чтобы вывести список содержимого каталога, создайте объект Path и возьмите итератор:
In [16]: Path ('/etc'). iterdir () Out [16]:
Если мы хотим просто список имен вещей:
In [17]: [x.name for x in Path ('/etc'). iterdir ()] Out [17]: ['emond.d', 'ntp-restrict.conf', 'периодический',
Если вам нужны только каталоги:
В [18]: [x.name для x в пути ('/etc'). iterdir () if x.is_dir ()] Out [18]: ['emond. d ',' period ',' mach_init.d ',
Если вам нужны имена всех файлов conf в этом дереве:
В [20]: [x.name для x в пути ('/etc'). glob ('**/*. conf')] Out [20]: ['ntp-restrict.conf', ' dnsextd.conf ',' syslog.conf ',
Если вам нужен список файлов conf в дереве> = 1K:
In [23]: [x.name for x in Path ('/etc'). glob ('**/*. conf') if x.stat (). st_size> 1024] Out [23]: ['dnsextd.conf', 'pf.conf', 'autofs.conf',
Разрешение относительных путей стало проще:
In [32]: Path ('../Operational Metrics.md'). resolve () Out [32]: PosixPath ('/Users/starver/code/xxxx/Operational Metrics.md')
Навигация по пути довольно ясна (хотя и неожиданна):
В [10]: p = Path ('.') В [ 11]: core = p/'web'/'core'In [13]: [x для x в core.iterdir (), если x.is_file ()] Out [13]: [PosixPath (' web/core/metrics .py '), PosixPath (' web/core/services.py '), PosixPath (' web/core/querysets.py '),
Хотя os.listdir ()
подходит для генерации списка имен файлов и каталогов, часто вы хотите делать больше, когда у вас есть эти имена – а в Python3 pathlib упрощает эти другие дела. Давайте посмотрим, нравится ли вам это так же, как и мне.
Чтобы вывести список содержимого каталога, создайте объект Path и возьмите итератор:
In [16]: Path ('/etc'). iterdir () Out [16]:
Если мы хотим просто список имен вещей:
In [17]: [x.name for x in Path ('/etc'). iterdir ()] Out [17]: ['emond.d', 'ntp-restrict.conf', 'периодический',
Если вам нужны только каталоги:
В [18]: [x.name для x в пути ('/etc'). iterdir () if x.is_dir ()] Out [18]: ['emond.d', 'периодический', ' mach_init.d ',
Если вам нужны имена всех файлов conf в этом дереве:
В [20]: [x.name для x в пути ('/etc'). glob ('**/*. conf')] Out [20]: ['ntp-restrict.conf', 'dnsextd.conf', 'syslog. conf ',
Если вам нужен список файлов conf в дереве> = 1 КБ:
В [23]: [x.name для x в Path ('/etc'). glob ('**/*. conf'), если x.stat (). st_size> 1024] Out [23]: ['dnsextd.conf', ' пф. conf ',' autofs. conf ',
Разрешение относительных путей стало проще:
В [32]: Path (' ../Operational Metrics. md '). resolve () Out [32]: PosixPath ('/Users/starver/code/xxxx/Operational Metrics.md ')
Навигация с помощью пути довольно понятна (хотя и неожиданно):
В [10]: p = Path ('.') В [11]: core = p/'web'/'core'In [ 13]: [x вместо x в core.iterdir (), если x.is_file ()] Out [13]: [PosixPath ('web/core/metrics.py'), PosixPath ('web/core/services.py' ), PosixPath ('web/core/querysets.py'),
Хороший лайнер для рекурсивного перечисления только файлов. Я использовал это в своей директиве setup.py package_data:
import os [os.path.join (x [0], y) для x в os.walk (' ') для y в x [2]]
Я знаю, что это не ответ на вопрос, но может пригодиться
Хороший лайнер для рекурсивного перечисления только файлов. Я использовал это в своей директиве setup.py package_data:
import os [os.path.join (x [0], y) для x в os.walk (' ') для y в x [2]]
Я знаю, что это не ответ на вопрос, но может пригодиться
#!/bin/python2import osdef scan_dir (путь): распечатать карту (os.path.abspath, os.listdir (pwd))
Для фильтра и карты вам нужно обернуть их списком ()
#!/bin/python3import osdef scan_dir (путь): print (list (map (os.path.abspath, os.listdir (pwd))))
Теперь рекомендуется заменить использование map и filter выражениями генераторов или списками:
#!/bin/pythonimport osdef scan_dir (path): print ( [os.path.abspath (f) для f в os.listdir (path)])

#!/bin/python2import osdef scan_dir (path): распечатать карту (os.path.abspath, os. listdir (pwd))
Для фильтра и карты вам нужно обернуть их списком ()
#!/bin/ python3import osdef scan_dir (path): print (list (map (os.path.abspath, os.listdir (pwd))))
Теперь рекомендуется заменить свое использование карты и фильтра с выражениями генераторов или списками:
#!/bin/pythonimport osdef scan_dir (path): print ([os.path.abspath (f) for f в os.listdir (путь)])
Тот, который работал со мной, является своего рода модифицированной версией ответа Салеха в другом месте на этой странице.
Код выглядит следующим образом:
dir = 'given_directory_name'filenames = [os.path.abspath (os.path.join (dir, i)) для i в os.listdir (dir)]

Тот, который работал со мной, является своего рода модифицированной версией ответа Салеха в другом месте на этой странице.
Код выглядит следующим образом:
dir = 'given_directory_name'filenames = [os.path.abspath (os.path.join (dir, i)) for i in os. listdir (dir)]
#import modulesimport os_CURRENT_DIR = '.'def rec_tree_traverse (curr_dir, indent): "рекурсивная функция для обхода каталога" #print "[traverse_tree]" try: dfList = [os.path.join (curr_dir , f_or_d) для f_or_d в os.listdir (curr_dir)] за исключением: print "неправильное имя пути/имя каталога" возврат для file_or_dir в dfList: если os.path.isdir (file_or_dir): #print "dir:", print indent, file_or_dir, "\" rec_tree_traverse (file_or_dir, indent * 2) if os.path.isfile (file_or_dir): #print "file:", print indent, file_or_dir #end if for loop # конец traverse_tree () def main (): base_dir = _CURRENT_DIR rec_tree_traverse (base_dir, "") raw_input ("введите любой ключ для выхода ....") # конец main () if __name__ == '__main__': main ()
-
5На этот вопрос уже есть совершенно хороший ответ, нет нужно ответить еще раз – Майк Пеннингтон, 23 ноя., 2012, 11:57
#import modulesimport os_CURRENT_DIR = '.'def rec_tree_traverse (curr_dir, indent): "рекурсивная функция для обхода каталога "#print" [traverse_tree] "try: dfList = [os.path.join (curr_dir, f_or_d) для f_or_d в os.listdir (curr_dir)] за исключением: print« неправильный путь/имя каталога »возврат для file_or_dir в dfList: if os.path.isdir (file_or_dir): #print "dir:", print indent, file_or_dir, "\" rec_tree_traverse (file_or_dir, indent * 2) if os.path.isfile (file_or_dir): #print "file:" , print indent, file_or_dir #end if for loop # конец traverse_tree () def main (): base_dir = _CURRENT_DIR rec_tree_traverse (base_dir, "") raw_input ("введите любой ключ для выхода ....") # конец main ( ) if __name__ == '__main__': main ()
FYI Добавьте фильтр расширения или импорта файлов ext.
path = '.' для dirname, dirn ames, имена файлов в os.walk (path): # распечатать путь ко всем именам файлов с расширением py. для имени файла в именах файлов: fname_path = os.path.join (dirname, filename) fext = os.path.splitext (fname_path) [1] if fext == '.py': напечатать fname_path else: continue
FYI Добавьте фильтр расширения или импорта файлов ext.
path = ' . 'для dirname, dirnames, filenames в os.walk (path): # выводить путь ко всем именам файлов с расширением py. для имени файла в именах файлов: fname_path = os.path.join (dirname, filename) fext = os.path.splitext (fname_path) [1] if fext == '.py': напечатать fname_path else: continue
Если бы подумал, я бы добавил это. Простой и грязный способ поиска подстановочных знаков.
import reimport os [a for a in os.listdir (".") If re.search ("^. * . py $ ", a)]

Если бы подумал, я бы добавил это. Просто и грязный способ поиска с подстановочными знаками.
import reimport os [a for a in os.listdir (".") if re.search ("^. * . py $ ", a)]
В приведенном ниже коде будут перечислены каталоги и файлы внутри dir
def print_directory_contents (sPath): import os для sChild в os.listdir (sPath): sChildPath = os.path .join (sPath, sChild), если os.path.isdir (sChildPath): print_directory_c ontents (sChildPath) else: print (sChildPath)

В приведенном ниже коде будут перечислены каталоги и файлы в каталоге
def print_directory_contents ( sPath): импортировать ОС для sChild в os.listdir (sPath): sChildPath = os.path.join (sPath, sChild) если os.path.isdir (sChildPath): print_directory_contents (sChildPath) else: print (sChildPath)
Вот однострочный Pythonic версия:
import osdir = 'given_directory_name'filenames = [os.path.join (os.path.dirname (os.path.abspath (__ file __)), dir, i ) для i в os.listdir (dir)]
Этот код перечисляет полный путь ко всем файлам и каталогам в указанном имени каталога.
-
Спасибо, Салех, но ваш код не работал полностью, а тот, который работал, был изменен следующим образом: ‘dir =’ given_directory_name ‘filenames = [os.path.abspath (os.path .join (dir, i)) для i в os. listdir (dir)] ‘- HassanSh__3571619 18 марта ’18 в 16:24
Вот однострочная версия Pythonic:
import osdir = 'given_directory_name' filenames = [os.path.join (os.path.dirname (os.path.abspath (__ file __)), dir, i) for i в os.listdir (dir)]
Этот код перечисляет полный путь ко всем файлам и каталогам в указанном имени каталога.
Я знаю, что это старый вопрос . Это изящный способ, с которым я столкнулся, если вы используете liunx-машину.
import subprocessprint (subprocess.check_output (["ls", "/" ]).decode("utf8"))
-
2Это чрезвычайно неэффективен, а также подвержен ошибкам. Python прекрасно знает, как перемещаться по списку каталогов, и вам в любом случае не следует использовать
ls
в скриптах. – tripleee 24 нояб. ’20 в 8:23
Я знаю, что это старый вопрос. Это изящный способ, с которым я столкнулся, если вы используете liunx-машину.
import subprocessprint (subprocess.check_output (["ls", "/" ]).decode("utf8"))
Как использовать дерево, чтобы показать путь к именам файлов, содержащим определенную строку?
У меня довольно большая файловая система, и скажем, что Я хочу найти все файлы и каталоги в определенной области моей файловой системы, которые содержат String ActionListeener
, и для этого я хочу использовать дерево
. Итак, если я это сделаю:
tree ~/| grep ActionListeener
Результатом будет:
│ │ │ └── ActionListeener.class│ │ └── ActionListeener. java
Итак, теперь я знаю, что эти файлы действительно существуют где-то немного глубже в моей файловой системе, но я понятия не имею, какая папка содержит подпапку, которая содержит подпапку -sub-folder и так далее, в файлы.
Итак, на самом деле мой вопрос в том, как я могу получить команду tree (возможно, перенаправив вывод на что-то другое), чтобы показать мне папку и путь, который ведет меня к тем конкретным файлам, которые содержат эту строку?
Информация об ОС:
Описание: Ubuntu 15.04Release : 15.04
Информация о пакете:
tree: Установлено: 1.7.0-3 Кандидат: 1.7.0-3 Таблица версий : *** 1.7.0-3 0500 http://gb.archive.ubuntu. com/ubuntu/vivid/universe amd64 Пакеты 100/var/lib/dpkg/status
Использовать шаблон tree
соответствие ( -P
) в сочетании с - prune
:
$ tree.├── archlinux-simpleblack│ ├── angle-down.png│ ├── archlinux.png # snip ├── reboot.png ├── shutdown.png └── theme.conf8 каталогов, 78 файлов $ tree -P 'reboot * '--prune .├── maui│ └── reboot.png└── maui-dark └── reboot.png2 каталогов, 2 файла
Из man tree
:
-P шаблон Список только тех файлов, которые соответствуют шаблону подстановочного знака. Примечание: вы должны использовать параметр -a, чтобы также рассматривать файлы, начинающиеся с точки `. ' для сопоставления. Допустимые операторы с подстановочными знаками: `* '(любые ноль или более символов),`?' (любой одиночный символ), `[...] '(любой одиночный символ, указанный в скобках (необязательно - (тире) для диапазона символов может использоваться: например: [AZ]), и` [^ ...]' ( любой отдельный символ, не указанный в скобках) и `| 'разделяет альтернативные шаблоны. --prune Заставляет дерево удалять пустые каталоги из вывода, полезно при использовании вместе с -P или -I. См. ОШИБКИ И ПРИМЕЧАНИЯ ниже для получения дополнительной информации об этом вариант.
Используйте параметр дерева -f
. Из man tree
:
-f Выводит префикс полного пути для каждого файла.
Итак, ваша команда будет:
tree -f ~/| grep 'ActionListeener'
Обратите внимание, что это будет соответствовать ActionListeener
в любом месте строки, поэтому будьте точны при выборе каталога, в котором вы это запустите.

Используйте параметр дерева -f
. Из man tree
:
-f Печатает префикс полного пути для каждого файла.
Итак, ваша команда будет выглядеть так:
tree -f ~/| grep 'ActionListeener'
Обратите внимание, что это будет соответствовать ActionListeener
в любом месте строки, поэтому будьте точны при выборе каталога, в котором вы будете запускать это.
Попробуйте дерево -P '' --prune
В вашем случае: tree -P 'ActionListeener' ~ --prune

Попробуйте tree -P '' --prune
В вашем случае: tree -P 'ActionListeener' ~ --prune