В Java вы можете сделать File.listFiles()
и получить все файлы в каталоге. Затем вы можете легко выполнить рекурсию через деревья каталогов.
Есть ли аналогичный способ сделать это в Python?
В Java вы можете сделать File.listFiles()
и получить все файлы в каталоге. Затем вы можете легко выполнить рекурсию через деревья каталогов.
Есть ли аналогичный способ сделать это в Python?
Да, есть. Путь Python еще лучше.
Существует три возможности:
1) Подобно File.listFiles():
Python имеет функцию os.listdir(путь). Он работает как метод Java.
2) расширение шаблона pathname с помощью glob:
Модуль glob содержит функции для перечисления файлов в файловой системе с использованием шаблона оболочки Unix, например.
files = glob.glob('/usr/joe/*.gif')
3) Перемещение файла с помощью walk:
Действительно приятна функция os.walk Python.
Метод walk возвращает функцию генерации, которая рекурсивно перечисляет все каталоги и файлы ниже заданного начального пути.
Пример:
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
Вы можете даже на лету удалить каталоги из "dirs", чтобы не дойти до этого каталога: если "joe" в dirs: dirs.remove( "joe" ), чтобы не ходить в каталоги, называемые "joe" .
listdir и walk документированы здесь. glob документирован здесь.
Как долгое время Pythonista, я должен сказать, что функции манипуляции с файлами path/file в библиотеке std являются подпараметрами: они не являются объектно-ориентированными и отражают устаревшие функции let-wrap-OS-system - бездумная философия. Я бы сердечно рекомендовал модуль "путь" в качестве обертки (вокруг 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()
Попробуйте "listdir()" в модуле os (docs):
import os
print os.listdir('.')
Прямо из библиотеки рефералов Python
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
Взгляните на 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))
Используйте 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
проще, во всяком случае, или, по крайней мере, я нахожу его более простым.
Вы также можете проверить 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)