Usar os.path.split
o, os.path.basename
como lo sugieren otros, no funcionará en todos los casos: si está ejecutando el script en Linux e intenta procesar una ruta clásica al estilo de Windows, fallará.
Las rutas de Windows pueden usar barra diagonal inversa o barra diagonal como separador de ruta. Por lo tanto, el ntpath
módulo (que es equivalente a os.path cuando se ejecuta en Windows) funcionará para todas las (1) rutas en todas las plataformas.
import ntpath
ntpath.basename("a/b/c")
Por supuesto, si el archivo termina con una barra oblicua, el nombre base estará vacío, así que haga su propia función para tratarlo:
def path_leaf(path):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
Verificación:
>>> paths = ['a/b/c/', 'a/b/c', '\\a\\b\\c', '\\a\\b\\c\\', 'a\\b\\c',
... 'a/b/../../a/b/c/', 'a/b/../../a/b/c']
>>> [path_leaf(path) for path in paths]
['c', 'c', 'c', 'c', 'c', 'c', 'c']
(1) Hay una advertencia: los nombres de archivo de Linux pueden contener barras invertidas . Entonces, en Linux, r'a/b\c'
siempre se refiere al archivo b\c
en la a
carpeta, mientras que en Windows, siempre se refiere al c
archivo en la b
subcarpeta de la a
carpeta. Entonces, cuando se utilizan barras diagonales hacia adelante y hacia atrás en una ruta, debe conocer la plataforma asociada para poder interpretarla correctamente. En la práctica, generalmente es seguro asumir que es una ruta de Windows, ya que las barras invertidas rara vez se usan en los nombres de archivos de Linux, pero tenga esto en cuenta cuando codifique para que no cree agujeros de seguridad accidentales.
os.path
solo carga elntpath
módulo internamente. Con este módulo, es posible manejar los'\\'
separadores de ruta incluso en máquinas Linux. Para Linux, elposixpath
módulo (resp.os.path
) Simplificará las operaciones de ruta para permitir solo'/'
separadores de estilo posix .r'C:\path\to\file.txt'
) en una máquina Linux, necesita usar el módulo ntpath. De lo contrario, puede usar las funciones de os.path. Esto se debe a que los sistemas Linux normalmente permiten el uso de los caracteres de barra diagonal inversa en los nombres de archivo (como se explica en la respuesta).os.path.basename(os.path.normpath(path))
?En realidad, hay una función que devuelve exactamente lo que quieres
fuente
os.path.basename(your_path)
Esto funcionó! Quería ruta del script:os.path.dirname(os.path.realpath(__file__))
y el nombre del script:os.path.basename(os.path.realpath(__file__))
. ¡Gracias!'C:\\temp\\bla.txt'
lugar.os.path.split es la función que busca
fuente
En python 3
fuente
cola es lo que quieres, el nombre del archivo.
Consulte los documentos del módulo del sistema operativo Python para obtener más detalles.
fuente
fuente
En su ejemplo, también necesitará quitar una barra diagonal del lado derecho para regresar
c
:Segundo nivel:
Actualización: creo que
lazyr
ha proporcionado la respuesta correcta. Mi código no funcionará con rutas similares a Windows en sistemas Unix y viceversa frente a rutas similares a Unix en sistemas Windows.fuente
r"a\b\c"
en Linux, ni"a/b/c"
en Windows.os.path.basename(path)
solo funcionará sios.path.isfile(path)
es asíTrue
. Porpath = 'a/b/c/'
lo tanto, no es un nombre de archivo válido en absoluto ...os.path.basename("a/b/c/")
vuelve""
debido a la barra inclinada final.lazyr
¡tienes razón! No pensé en eso. ¿Sería seguro hacerlo solopath = path.replace('\\', '/')
?esto devolverá: paint.exe
fuente
fname = str(path).split('/')[-1]
Si desea obtener el nombre de archivo automáticamente, puede hacerlo
fuente
Si la ruta del archivo no terminó con "/" y los directorios están separados por "/", utilice el siguiente código. Como sabemos en general, la ruta no termina con "/".
Pero en algunos casos, como las URL terminan con "/", utilice el siguiente código
pero cuando su ruta se deletrea con "\", que generalmente se encuentra en las rutas de Windows, puede usar los siguientes códigos
Puede combinar ambos en una sola función marcando el tipo de sistema operativo y devolviendo el resultado.
fuente
Esto también funciona para Linux y Windows con la biblioteca estándar
Resultados:
fuente
Aquí hay una solución de expresiones regulares, que parece funcionar con cualquier ruta de sistema operativo en cualquier sistema operativo.
No se necesita ningún otro módulo, y tampoco se necesita preprocesamiento:
Actualizar:
Si sólo desea un potencial de nombre de archivo, si está presente (es decir,
/a/b/
es un directorio y también lo esc:\windows\
), cambiar la expresión regular a:r'[^\\/]+(?![\\/])$'
. Para el "regex desafiado", esto cambia la búsqueda anticipada positiva para algún tipo de barra diagonal a una vista anticipada negativa, lo que hace que los nombres de ruta que terminan con dicha barra no devuelvan nada en lugar del último subdirectorio en la ruta. Por supuesto, no hay garantía de que el nombre de archivo potencial realmente se refiera a un archivo y para esoos.path.is_dir()
oos.path.is_file()
deba emplearse.Esto coincidirá de la siguiente manera:
La expresión regular se puede probar aquí .
fuente
Tal vez solo mi solución todo en uno sin importantes novedades (considere el archivo temporal para crear archivos temporales: D)
Obtener los valores de
abc.name
será una cadena como esta:'/tmp/tmpks5oksk7'
así puedo reemplazar el/
con un espacio.replace("/", " ")
y luego llamarsplit()
. Eso devolverá una lista y obtengo el último elemento de la lista con[-1]
No es necesario importar ningún módulo.
fuente
Nunca he visto caminos con doble barra invertida, ¿existen? La característica incorporada del módulo python
os
falla para aquellos. Todos los demás funcionan, también la advertencia dada por usted conos.path.normpath()
:fuente
El separador de Windows puede estar en un nombre de archivo Unix o ruta de Windows. El separador de Unix solo puede existir en la ruta de Unix. La presencia de un separador de Unix indica una ruta que no es de Windows.
Lo siguiente eliminará (cortará el separador final) por el separador específico del sistema operativo, luego se dividirá y devolverá el valor más a la derecha. Es feo, pero simple basado en la suposición anterior. Si la suposición es incorrecta, actualice y actualizaré esta respuesta para que coincida con las condiciones más precisas.
Código de muestra:
fuente
Para completar, aquí está la
pathlib
solución para python 3.2+:Esto funciona tanto en Windows como en Linux.
fuente
En Python 2 y 3, usando el módulo pathlib2 :
Uso:
Con tu caso de prueba:
La idea aquí es convertir todas las rutas en la representación interna unificada de
pathlib2
, con diferentes decodificadores dependiendo de la plataforma. Afortunadamente,pathlib2
incluye un decodificador genérico llamadoPurePath
que debería funcionar en cualquier ruta. En caso de que esto no funcione, puede forzar el reconocimiento de la ruta de Windows utilizandofromwinpath=True
. Esto dividirá la cadena de entrada en partes, la última es la hoja que está buscando, de ahí lapath2unix(t)[-1]
.Si el argumento es
nojoin=False
, la ruta se volverá a unir, por lo que la salida es simplemente la cadena de entrada convertida a un formato Unix, que puede ser útil para comparar subrutas en las plataformas.fuente