2009-04-22 10 views
5

Actualmente estoy usando el directorio Walker de HereDirectorio Walker para 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 

Este pequeño cambio le permite tener la ruta completa en el archivo.

¿Alguien puede ayudarme a encontrar el nombre del archivo también? Necesito tanto la ruta completa como el nombre del archivo.

+0

¿Alguien me puede ayudar a encontrar el nombre del archivo también con esto? Necesito tanto la ruta completa como el nombre del archivo. – Specto

+0

print os.path.basename (archivo) – anon58192932

+0

Me gustaría decir que esto tampoco está sangrado correctamente. todo después de la clase DirectoryWalker necesita una sangría. – anon58192932

Respuesta

6

En lugar de utilizar '.' como su directorio, consulte a su ruta absoluta:

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

Además, me gustaría recomendar el uso de una palabra distinta de 'archivo', porque significa algo en el lenguaje Python. No es una palabra clave, aunque todavía se ejecuta.

Como acotación al margen, cuando se trata de nombres de archivo, creo que el módulo de os.path a ser increíblemente útil - te recomiendo echar un vistazo a través de que, sobre todo

os.path.normpath 

normaliza caminos (se deshace de redundancia '. de y 'dos ​​caminos theFolderYouWereJustIn /../' s)

os.path.join 

une

+0

funcionó muy bien gracias. – Specto

+0

¿Alguien puede ayudarme a encontrar el nombre del archivo también? Necesito tanto la ruta completa como el nombre del archivo. – Specto

0

simplemente escriba la ruta del directorio actual a la ruta "./foo" devolvió:

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

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

Esto también sería un lugar encantador para pensar la recursión.

12

¿Por qué quieres hacer algo tan aburrido tú mismo?

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 

Salida:

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

Pero si insiste, hay herramientas relacionadas a la ruta en os.path, os.basename es lo que está viendo.

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