2009-04-22 5 views
5

J'utilise actuellement le répertoire marcheur de HereDirectory Walker pour Python

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 

Ce changement mineur vous permet d'avoir le chemin complet dans le fichier.

Quelqu'un peut-il m'aider à trouver le nom de fichier aussi bien en utilisant cela? J'ai besoin à la fois du chemin complet et du nom de fichier.

+0

Quelqu'un peut-il m'aider à trouver le nom de fichier aussi bien en utilisant cela? J'ai besoin à la fois du chemin complet et du nom de fichier. – Specto

+0

print os.path.basename (fichier) – anon58192932

+0

Je voudrais dire que ce n'est pas correctement indenté non plus. tout après la classe DirectoryWalker a besoin d'un retrait. – anon58192932

Répondre

6

Plutôt que d'utiliser '.' comme votre répertoire, reportez-vous à son chemin absolu:

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

Aussi, je vous recommande d'utiliser un autre mot que « fichier », parce que cela signifie quelque chose dans la langue de python. Pas un mot-clé, même si ça fonctionne encore.

En aparté, en traitant avec des noms, je trouve le module os.path être incroyablement utile - je recommande d'avoir un coup d'œil que, en particulier

os.path.normpath 

normalise les chemins (se débarrasse de redondance » et de '. de theFolderYouWereJustIn /../)

os.path.join 

Rejoint deux chemins

+0

travaillé très bien merci. – Specto

+0

Quelqu'un peut-il m'aider à trouver le nom de fichier ainsi en utilisant cela? J'ai besoin à la fois du chemin complet et du nom de fichier. – Specto

0

Juste préfixer le chemin du répertoire courant sur le chemin "de ./foo" a retourné:

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

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

Ce serait aussi un endroit agréable pour penser à la récursivité.

12

Pourquoi voulez-vous faire une telle chose ennuyeuse vous-même?

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 

Sortie:

'.' 
    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' 

Mais si vous insistez, il y a chemin des outils liés à os.path, os.basename est ce que vous regardez.

>>> import os.path 
>>> os.path.basename('/hello/world.h') 
'world.h'