2010-04-18 10 views
9

Tengo varias secuencias de comandos que toman como entrada un nombre de directorio, y mi programa crea archivos en esos directorios. Algunas veces quiero tomar el nombre de un directorio dado al programa y usarlo para hacer varios archivos en el directorio. Por ejemplo,¿Manera elegante de tomar el nombre del directorio en Python?

# directory name given by user via command-line 
output_dir = "..." # obtained by OptParser, for example 
my_filename = output_dir + '/' + os.path.basename(output_dir) + '.my_program_output' 
# write stuff to my_filename 

El problema es que si el usuario da un nombre de directorio con una barra al final, a continuación, os.path.basename devolverá la cadena vacía, lo cual no es lo que quiero. ¿Cuál es la forma más elegante de abordar estos problemas de barra oblicua en Python? Sé que puedo verificar manualmente la barra al final de output_dir y eliminarla si está allí, pero parece que debería haber una forma mejor. ¿Esta ahí?

Además, ¿está bien agregar manualmente '/' caracteres? P.ej. output_dir + '/' os.path.basename() o hay una forma más genérica de crear rutas?

Gracias.

Respuesta

15

Para resolver su problema de "barra inclinada" (y otros problemas), limpie la entrada del usuario con os.path.normpath().

Para construir caminos, utilice os.path.join()

1

La creación manual de rutas es una mala idea para la portabilidad; se romperá en Windows. Debe usar os.path.sep.

En cuanto a su primera pregunta, usar os.path.join es la idea correcta.

+1

"" "se romperá en Windows" "": barras Incluyendo romperán sólo si le da de comer como parte de un comando de ejemplo 'os.system()'; el analizador de comandos de DOS solo entiende las barras diagonales inversas. Alimentando a, por ejemplo, open() está bastante bien. Sin embargo, si alguna vez se debe mostrar la ruta construida a un usuario o administrador de Windows, prepárese para una gran cantidad de errores :-) –

7

Usa os.path.join() para construir rutas. Por ejemplo:

>>> import os.path 
>>> path = 'foo/bar' 
>>> os.path.join(path, 'filename') 
'foo/bar/filename' 
>>> path = 'foo/bar/' 
>>> os.path.join(path, 'filename') 
'foo/bar/filename' 
1

para construir los caminos sin escribir barras es mejor utilizar:

os.path.join(dir, subdir, file) 

si desea agregar separadores u obtener el separador independly del sistema operativo, a continuación, utilizar

os.sep 
+0

como OP indicó, el problema es que si d es "mydir", esto devolvería una cadena vacía. –

+0

@Ofri: la sección correspondiente ha sido eliminada. – joaquin

2

Debe usar os.path.join() para agregar caminos juntos.

uso

os.path.dirname(os.path.join(output_dir,'')) 

para extraer dirname, mientras que la adición de una barra al final si se omitió.

Cuestiones relacionadas