Las últimas cadenas no deberían comenzar con una barra inclinada. Si comienzan con una barra oblicua, se consideran un "camino absoluto" y todo lo que está delante de ellos se descarta.
Citando los documentos de Python paraos.path.join
:
Si un componente es una ruta absoluta, todos los componentes anteriores se descartan y la unión continúa desde el componente de ruta absoluta.
Tenga en cuenta en Windows, el comportamiento en relación con las letras de unidad, que parece haber cambiado en comparación con las versiones anteriores de Python:
En Windows, la letra de la unidad no se restablece cuando se encuentra un componente de ruta absoluta (por ejemplo, r'\foo'
). Si un componente contiene una letra de unidad, todos los componentes anteriores se descartan y la letra de unidad se restablece. Tenga en cuenta que, dado que hay un directorio actual para cada unidad, os.path.join("c:", "foo")
representa una ruta relativa al directorio actual en la unidad C:
( c:foo
), no c:\foo
.
os.path.normpath
para lograr ese objetivo.La idea
os.path.join()
es hacer que su programa sea multiplataforma (linux / windows / etc).Incluso un corte lo arruina.
Por lo tanto, solo tiene sentido cuando se usa con algún tipo de punto de referencia como
os.environ['HOME']
oos.path.dirname(__file__)
.fuente
os.path.join()
se puede usar junto conos.path.sep
para crear una ruta absoluta en lugar de relativa.fuente
os.path.sep
como primer elemento para construir una ruta absoluta es mejor que cualquier otra respuesta aquí! El objetivo principal de usaros.path
métodos str en lugar de los básicos es evitar escribir/
. Poner cada subdirectorio como un nuevo argumento y eliminar todas las barras también es genial. ¡Probablemente sea una buena idea asegurarse con un cheque quetodaystr
no comience con una barra oblicua! ;)No utilice barras diagonales al principio de los componentes de la ruta, excepto cuando se refiera al directorio raíz:
ver también: http://docs.python.org/library/os.path.html#os.path.join
fuente
Para ayudar a comprender por qué este comportamiento sorprendente no es del todo terrible, considere una aplicación que acepte un nombre de archivo de configuración como argumento:
Si la aplicación se ejecuta con:
Se
/etc/myapp.conf/foo.conf
usará el archivo de configuración .Pero considere lo que sucede si se llama a la aplicación con:
Luego
myapp
debe usar el archivo de configuración en/some/path/bar.conf
(y no/etc/myapp.conf/some/path/bar.conf
o similar).Puede que no sea genial, pero creo que esta es la motivación para el comportamiento absoluto del camino.
fuente
Es porque su
'/new_sandbox/'
comienza con ay, por lo/
tanto, se supone que es relativo al directorio raíz. Retirar la guía/
.fuente
Para que su función sea más portátil, úsela como tal:
o
fuente
Pruebe la combinación de
split("/")
y*
para cadenas con combinaciones existentes.Cómo funciona...
split("/")
convierte la ruta existente en una lista:['', 'home', 'build', 'test', 'sandboxes', '']
*
delante de la lista se desglosa cada elemento de la lista con su propio parámetrofuente
Probar
new_sandbox
solo confuente
hazlo así, sin las barras extra
fuente
Tenga en cuenta que un problema similar puede morderlo si usa
os.path.join()
para incluir una extensión que ya incluye un punto, que es lo que sucede automáticamente cuando lo usaos.path.splitext()
. En este ejemplo:Aunque
extension
podría ser.jpg
que termines con una carpeta llamada "foobar" en lugar de un archivo llamado "foobar.jpg". Para evitar esto, debe agregar la extensión por separado:fuente
que pueda
strip
el'/'
:fuente
Recomiendo quitar la segunda y las siguientes cadenas de la cadena
os.path.sep
, evitando que se interpreten como rutas absolutas:fuente
Una versión más completa:
fuente
"\"
? Entonces su primer ejemplo se convierteos.path.join("a", *"/b".split("\\"))
, lo que produce"/b"
... Dudo que ese sea el resultado deseado.