Справочник Walker для Python - PullRequest
       6

Справочник Walker для Python

5 голосов
/ 22 апреля 2009

В настоящее время я использую каталогизатор из Здесь

import os
class DirectoryWalker:
# a forward iterator that traverses a directory tree

def __init__(self, directory):
    self.stack = [directory]
    self.files = []
    self.index = 0

def __getitem__(self, index):
    while 1:
        try:
            file = self.files[self.index]
            self.index = self.index + 1
        except IndexError:
            # pop next directory from stack
            self.directory = self.stack.pop()
            self.files = os.listdir(self.directory)
            self.index = 0
        else:
            # got a filename
            fullname = os.path.join(self.directory, file)
            if os.path.isdir(fullname) and not os.path.islink(fullname):
                self.stack.append(fullname)
            return fullname

for file in DirectoryWalker(os.path.abspath('.')):
    print file

Это незначительное изменение позволяет вам указать полный путь в файле.

Может кто-нибудь помочь мне, как найти только имя файла, используя это? Мне нужен как полный путь, так и просто имя файла.

Ответы [ 4 ]

12 голосов
/ 22 апреля 2009

Почему ты хочешь сделать такую ​​скучную вещь сам?

for path, directories, files in os.walk('.'):
    print 'ls %r' % path
    for directory in directories:
        print '    d%r' % directory
    for filename in files:
        print '    -%r' % filename

Выход:

'.'
    d'finction'
    d'.hg'
    -'setup.py'
    -'.hgignore'
'./finction'
    -'finction'
    -'cdg.pyc'
    -'util.pyc'
    -'cdg.py'
    -'util.py'
    -'__init__.pyc'
    -'__init__.py'
'./.hg'
    d'store'
    -'hgrc'
    -'requires'
    -'00changelog.i'
    -'undo.branch'
    -'dirstate'
    -'undo.dirstate'
    -'branch'
'./.hg/store'
    d'data'
    -'undo'
    -'00changelog.i'
    -'00manifest.i'
'./.hg/store/data'
    d'finction'
    -'.hgignore.i'
    -'setup.py.i'
'./.hg/store/data/finction'
    -'util.py.i'
    -'cdg.py.i'
    -'finction.i'
    -'____init____.py.i'

Но если вы настаиваете, в os.path есть инструменты, связанные с путями, os.basename - это то, на что вы смотрите.

>>> import os.path
>>> os.path.basename('/hello/world.h')
'world.h'
6 голосов
/ 22 апреля 2009

Вместо использования '.' как ваш каталог, обратитесь к его абсолютному пути:

for file in DirectoryWalker(os.path.abspath('.')):
    print file

Кроме того, я бы рекомендовал использовать слово, отличное от «file», потому что оно что-то означает в языке Python. Не ключевое слово, хотя оно все еще работает.

Кроме того, при работе с именами файлов я считаю, что модуль os.path невероятно полезен - я бы рекомендовал просмотреть это, особенно

os.path.normpath

Нормализует пути (избавляет от лишних '. И' theFolderYouWereJustIn /../ 's)

os.path.join

Объединяет два пути

1 голос
/ 22 апреля 2009

os.path.dirname ()? os.path.normpath ()? os.path.abspath ()

Это также было бы прекрасным местом для мысли о рекурсии.

0 голосов
/ 22 апреля 2009

Просто добавьте текущий путь к каталогу к возвращенному пути "./foo":

print os.path.join(os.getcwd(), file)
...