name filename example and __file__ python python-2.7 os.path

python - filename - path os path join name



Python os.path.join() en una lista (5)

puedo hacer

>>> os.path.join("c:/","home","foo","bar","some.txt") ''c:/home//foo//bar//some.txt''

Pero cuando lo hago

>>> s = "c:/,home,foo,bar,some.txt".split(",") >>> os.path.join(s) [''c:/'', ''home'', ''foo'', ''bar'', ''some.txt'']

¿Que me estoy perdiendo aqui?


Asumiendo que la join no fue diseñada de esa manera (que es, como señaló ATOzTOA), y solo tomó dos parámetros, aún podrías usar la reduce incorporada:

>>> reduce(os.path.join,["c:/","home","foo","bar","some.txt"]) ''c:/home//foo//bar//some.txt''

Mismo resultado como:

>>> os.path.join(*["c:/","home","foo","bar","some.txt"]) ''c:/home//foo//bar//some.txt''

Solo por completitud y razones educativas (y para otras situaciones en las que * no funciona).

Sugerencia para Python 3 Para Python 3, reduce se movió al módulo functools .


El problema es que os.path.join no toma una list como argumento, tiene que ser argumentos separados.

Aquí es donde * , el operador ''splat'' entra en juego ...

puedo hacer

>>> s = "c:/,home,foo,bar,some.txt".split(",") >>> os.path.join(*s) ''c:/home//foo//bar//some.txt''


Es solo el método. No te estás perdiendo nada. La documentación oficial muestra que puede usar el desempaquetado de listas para proporcionar varias rutas:

s = "c:/,home,foo,bar,some.txt".split(",") os.path.join(*s)

Tenga en cuenta el *s intead de simplemente s en os.path.join(*s) . El uso del asterisco desencadenará el desempaquetado de la lista, lo que significa que cada argumento de la lista se suministrará a la función como un argumento separado.


Esto también se puede considerar como una simple operación de reducción de mapa si le gustaría pensarlo desde una perspectiva de programación funcional.

import os folders = [("home",".vim"),("home","zathura")] [reduce(lambda x,y: os.path.join(x,y), each, "") for each in folders]

reduce está incorporado en Python 2.x. En Python 3.x se ha movido a itertools Sin embargo, la respuesta aceptada es mejor.

Esto se ha respondido a continuación pero respondiendo si tiene una lista de elementos que se deben unir.


Me tropecé con la situación en la que la lista podría estar vacía. En ese caso:

os.path.join('''', *the_list_with_path_components)

Tenga en cuenta el primer argumento, que no alterará el resultado.