В Java вы можете выполнить File.listFiles() и получить все файлы в каталоге. Затем вы можете легко просматривать деревья каталогов.
Есть ли аналогичный способ сделать это в Python?




Прямо из справочной библиотеки Python
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
Попробуйте "listdir ()" в модуле ОС (документы):
import os
print os.listdir('.')
Взгляните на os.walk() и примеры здесь. С os.walk() вы можете легко обработать все дерево каталогов.
Пример по ссылке выше ...
# Delete everything reachable from the directory named in 'top',
# assuming there are no symbolic links.
# CAUTION: This is dangerous! For example, if top == '/', it
# could delete all your disk files.
import os
for root, dirs, files in os.walk(top, topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))
Да, есть. Способ Python даже лучше.
Есть три возможности:
1) Как File.listFiles ():
В Python есть функция os.listdir (path). Он работает как метод Java.
2) расширение шаблона имени пути с помощью glob:
Модуль glob содержит функции для вывода списка файлов в файловой системе с использованием шаблона оболочки Unix, например
files = glob.glob('/usr/joe/*.gif')
3) Обход файла с обходом:
Действительно хороша функция os.walk в Python.
Метод walk возвращает функцию генерации, которая рекурсивно перечисляет все каталоги и файлы ниже заданного начального пути.
Пример:
Вы даже можете "на лету" удалять каталоги из "dirs", чтобы избежать перехода к этому каталогу: if "joe" в dirs: dirs.remove ("joe"), чтобы не заходить в каталоги, называемые "joe".
import os
from os.path import join
for root, dirs, files in os.walk('/usr'):
print "Current directory", root
print "Sub directories", dirs
print "Files", files
listdir и walk задокументированы как здесь. glob задокументирован здесь.
Используйте os.path.walk, если вам также нужны подкаталоги.
walk(top, func, arg)
Directory tree walk with callback function.
For each directory in the directory tree rooted at top (including top
itself, but excluding '.' and '..'), call func(arg, dirname, fnames).
dirname is the name of the directory, and fnames a list of the names of
the files and subdirectories in dirname (excluding '.' and '..'). func
may modify the fnames list in-place (e.g. via del or slice assignment),
and walk will only recurse into the subdirectories whose names remain in
fnames; this can be used to implement a filter, or to impose a specific
order of visiting. No semantics are defined for, or required of, arg,
beyond that arg is always passed to func. It can be used, e.g., to pass
a filename pattern, or a mutable object designed to accumulate
statistics. Passing None for arg is common.
Я бы порекомендовал против os.path.walk, поскольку он удаляется в Python 3.0. os.walk в любом случае проще, или хотя бы я посчитал его проще.
Как давний Pythonista, я должен сказать, что функции манипулирования путями / файлами в библиотеке std являются второстепенными: они не объектно-ориентированы и отражают устаревшие функции Let's-wrap-OS-system-without- философия мышления. Я искренне рекомендую модуль 'path' в качестве оболочки (вокруг os, os.path, glob и tempfile, если вы должны знать): намного лучше и OOPy: http://pypi.python.org/pypi/path.py/2.2
Это walk () с модулем пути:
dir = path(os.environ['HOME'])
for f in dir.walk():
if f.isfile() and f.endswith('~'):
f.remove()
Вы также можете попробовать Unipath, объектно-ориентированную оболочку модулей Python os, os.path и shutil.
Пример:
>>> from unipath import Path
>>> p = Path('/Users/kermit')
>>> p.listdir()
Path(u'/Users/kermit/Applications'),
Path(u'/Users/kermit/Desktop'),
Path(u'/Users/kermit/Documents'),
Path(u'/Users/kermit/Downloads'),
...
Установка через Сырный магазин:
$ pip install unipath
Видя, как я программировал на Python в течение долгого времени, я много раз использовал модуль os и создал свою собственную функцию для печати всех файлов в каталоге.
Код функции:
import os
def PrintFiles(direc):
files = os.listdir(direc)
for x in range(len(files)):
print("File no. "+str(x+1)+": "+files[x])
PrintFiles(direc)