Каталог-дерево листинга в Python
Как получить список всех файлов (и каталогов) в данном каталоге в Python?
20 ответов:
Это способ обхода каждого файла и каталога в дереве каталогов:
import os for dirname, dirnames, filenames in os.walk('.'): # print path to all subdirectories first. for subdirname in dirnames: print(os.path.join(dirname, subdirname)) # print path to all filenames. for filename in filenames: print(os.path.join(dirname, filename)) # Advanced usage: # editing the 'dirnames' list will stop os.walk() from recursing into there. if '.git' in dirnames: # don't go into any .git directories. dirnames.remove('.git')
можно использовать
os.listdir(path)
для справки и больше функций ОС смотрите здесь:
- Python 2 docs:https://docs.python.org/2/library/os.html#os.listdir
- Python 3 docs:https://docs.python.org/3/library/os.html#os.listdir
вот вспомогательная функция, которую я использую довольно часто:
import os def listdir_fullpath(d): return [os.path.join(d, f) for f in os.listdir(d)]
Если вам нужна подстановка способностей, есть модуль для этого, как хорошо. Например:
import glob glob.glob('./[0-9].*')
возвращает что-то вроде:
['./1.gif', './2.txt']
см. документацию здесь.
попробуйте это:
import os for top, dirs, files in os.walk('./'): for nm in files: print os.path.join(top, nm)
для файлов в текущем рабочем каталоге без указания пути
Python 2.7:
import os os.listdir(os.getcwd())
Python 3.x:
import os os.listdir()
спасибо Stam Kaly за комментарий к python 3.x
рекурсивная реализация
import os def 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)
Я написал длинную версию, со всеми опциями, которые мне могут понадобиться:http://sam.nipl.net/code/python/find.py
Я думаю, что он подойдет и здесь:
#!/usr/bin/env python import os import sys def ls(dir, hidden=False, relative=True): nodes = [] for nm in 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 nodes def find(root, files=True, dirs=False, hidden=False, relative=True, topdown=True): root = os.path.join(root, '') # add slash if not there for parent, ldirs, lfiles in os.walk(root, topdown=topdown): if relative: parent = parent[len(root):] if dirs and parent: yield os.path.join(parent, '') if not hidden: lfiles = [nm for nm in lfiles if not nm.startswith('.')] ldirs[:] = [nm for nm in ldirs if not nm.startswith('.')] # in place if files: lfiles.sort() for nm in lfiles: nm = os.path.join(parent, nm) yield nm def test(root): print "* directory listing, with hidden files:" print ls(root, hidden=True) print print "* recursive listing, with dirs, but no hidden files:" for f in find(root, dirs=True): print f print if __name__ == "__main__": test(*sys.argv[1:])
хороший один лайнер, чтобы перечислить только файлы рекурсивно. Я использовал это в моем setup.py директива package_data:
import os [os.path.join(x[0],y) for x in os.walk('<some_directory>') for y in x[2]]
Я знаю, что это не ответ на вопрос, но может пригодится
Для Python 2
#!/bin/python2 import os def scan_dir(path): print map(os.path.abspath, os.listdir(pwd))
Для Python 3
для фильтра и карты, вам нужно обернуть их со списком ()
#!/bin/python3 import os def scan_dir(path): print(list(map(os.path.abspath, os.listdir(pwd))))
рекомендация теперь заключается в том, что вы заменяете использование карты и фильтра генераторами выражений или списков:
#!/bin/python import os def scan_dir(path): print([os.path.abspath(f) for f in os.listdir(path)])
вот одна линия обновления версии:
import os dir = 'given_directory_name' filenames = [os.path.join(os.path.dirname(os.path.abspath(__file__)),dir,i) for i in os.listdir(dir)]
этот код содержит полный путь ко всем файлам и каталогам в данном имени каталога.
#import modules import os _CURRENT_DIR = '.' def rec_tree_traverse(curr_dir, indent): "recurcive function to traverse the directory" #print "[traverse_tree]" try : dfList = [os.path.join(curr_dir, f_or_d) for f_or_d in os.listdir(curr_dir)] except: print "wrong path name/directory name" return for file_or_dir in 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 #end of traverse_tree() def main(): base_dir = _CURRENT_DIR rec_tree_traverse(base_dir," ") raw_input("enter any key to exit....") #end of main() if __name__ == '__main__': main()
FYI Добавить фильтр расширения или ext файла импорт ОС
path = '.' for dirname, dirnames, filenames in os.walk(path): # print path to all filenames with extension py. for filename in filenames: fname_path = os.path.join(dirname, filename) fext = os.path.splitext(fname_path)[1] if fext == '.py': print fname_path else: continue
import os, sys #open files in directory path = "My Documents" dirs = os.listdir( path ) # print the files in given directory for file in dirs: print (file)
если бы понял, что я бы бросил это. Простой и грязный способ сделать поиск по шаблону.
import re import os [a for a in os.listdir(".") if re.search("^.*\.py$",a)]
ниже кода будет список каталогов и файлов в пределах dir
def print_directory_contents(sPath): import os for sChild in os.listdir(sPath): sChildPath = os.path.join(sPath,sChild) if os.path.isdir(sChildPath): print_directory_contents(sChildPath) else: print(sChildPath)
Я знаю, это старый вопрос. Это аккуратный способ, с которым я столкнулся, если вы находитесь на машине liunx.
import subprocess print(subprocess.check_output(["ls", "/"]).decode("utf8"))
тот, кто работал со мной, является своего рода модифицированной версией ответа Салеха выше.
код выглядит следующим образом:
"dir =' given_directory_name ' filenames = [os.путь.abspath(os.путь.join (dir,i)) для i в ОС.listdir(реж)]"
вот еще один вариант.
os.scandir(path='.')
он возвращает итератор ОС.Объекты DirEntry, соответствующие записям (вместе с атрибутивной информацией файла) в каталоге, заданном путем.
пример:
with os.scandir(path) as it: for entry in it: if not entry.name.startswith('.'): print(entry.name)
использование scandir () вместо listdir () может значительно повысить производительность кода, который также нуждается в информации о типе файла или атрибуте файла, потому что ОС.Объекты DirEntry предоставляют эту информацию, если операционная система предоставляет его при сканировании каталога. Все ОС.Методы DirEntry могут выполнять системный вызов, но is_dir() и is_file() обычно требуют только системного вызова для символьных ссылок; os.DirEntry.stat () всегда требует системного вызова в Unix, но только для символических ссылок в Windows.