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