2012-03-22 35 views

Respuesta

32

os.path.abspath se asegura un camino es absoluta. Utilice la siguiente función auxiliar:

import os 

def absoluteFilePaths(directory): 
    for dirpath,_,filenames in os.walk(directory): 
     for f in filenames: 
      yield os.path.abspath(os.path.join(dirpath, f)) 
+0

Creo que es mejor hacer el abspath solo una vez, en la línea 'os.walk', que hacerlo N veces dentro del ciclo – wim

+0

Eso funciona, pero solo por" accidente ". Leyendo el contrato de 'os.path.join', no puedo encontrar ningún lugar que garantice que el resultado sea absoluto si uno de los argumentos es, aunque esa es una suposición razonable. – phihag

+0

Hay una marca de paréntesis en exceso al final. Debe ser yield os.path.abspath (os.path.join (dirpath, f)) – jumbopap

7
import os 

for root, dirs, files in os.walk(os.path.abspath("../path/to/dir/")): 
    for file in files: 
     print os.path.join(root, file) 
+0

Está bien, entiendo lo que quiere decir, simplemente no quería los archivos, pero quería subdirectorios específicos. He publicado la solución a continuación. –

3

Se puede utilizar para convertir os.path.abspath() rutas relativas en las rutas absolutas:

file_paths = [] 

for folder, subs, files in os.walk(rootdir): 
    for filename in files: 
    file_paths.append(os.path.abspath(os.path.join(folder, filename))) 
+1

¿no une esto 'cwd' a' filename', cuando quiere unirse a la 'carpeta'? – wim

+0

Gracias, licuadora. Pero creo que tiene que ser ... os.path.abspath (os.path.join (carpeta, nombre de archivo)) .. – madCode

+1

Por qué sí, lo hace. Gracias, lo he arreglado. – Blender

7

Probar:

import os 

for root, dirs, files in os.walk('.'): 
    for file in files: 
     p=os.path.join(root,file) 
     print p 
     print os.path.abspath(p) 
     print 
+0

¿De todos modos para hacer esto sin capturar archivos ocultos? –

+0

@MarcelMarino 'if not file.startswith ('.')' –

0

quería mantener los detalles de subdirectorios y no los archivos y subdirectorios querían sólo con un archivo XML en ellos. Puedo hacerlo de esta manera:

for rootDirectory, subDirectories, files in os.walk(eventDirectory): 
    for subDirectory in subDirectories: 
    absSubDir = os.path.join(rootDirectory, subDirectory) 
    if len(glob.glob(os.path.join(absSubDir, "*.xml"))) == 1: 
     print "Parsing information in " + absSubDir 
2

Si tiene Python 3.4 o posterior puede utilizar pathlib (o una backport de terceros si usted tiene una versión anterior de Python):

import pathlib 
for filepath in pathlib.Path(directory).glob('**/*'): 
    print(filepath.absolute()) 
Cuestiones relacionadas