Ищите функции обхода файлов в 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 возвращает функцию генерации, которая рекурсивно выводит список всех каталогов и файлов ниже заданного начального пути.

Пример:

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 описаны здесь. шар задокументирован здесь.

Как давний 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)
Другие вопросы по тегам