¿Hay una función para extraer la extensión de un nombre de archivo?
1301
¿Hay una función para extraer la extensión de un nombre de archivo?
Si. Uso os.path.splitext
(consulte la documentación de Python 2.X o la documentación de Python 3.X ):
>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'
A diferencia de la mayoría de los intentos manuales de división de cadenas, os.path.splitext
se tratará correctamente /a/b.c/d
como sin extensión en lugar de tener extensión .c/d
, y se tratará .bashrc
como si no tuviera extensión en lugar de tener extensión .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
basename
es un poco confuso aquí yaos.path.basename("/path/to/somefile.ext")
que volvería"somefile.ext"
endswith()
sería más portátil y pitónico?.asd
es realmente la extensión! Si lo piensa,foo.tar.gz
es un archivo comprimido con gzip (.gz
) que resulta ser un archivo tar (.tar
). Pero es un archivo gzip en primer lugar. No esperaría que devuelva la extensión dual en absoluto.splittext
. Si simplemente hicieran algo para significar la ruptura entre partes de este nombre, sería mucho más fácil reconocer que essplitExt
osplit_ext
. ¿Seguramente no puedo ser la única persona que ha cometido este error?os.path.splitext('somefile.ext')
=>('somefile', '.ext')
. Siéntase libre de proporcionar un ejemplo de contador real sin hacer referencia a alguna biblioteca de terceros.fuente
import os.path
lugar defrom os import path
?from os import path
entonces el nombrepath
se toma en su ámbito local, también otros que miran el código pueden no saber de inmediato que la ruta es la ruta desde el módulo os. Donde, como si lo usa,import os.path
lo mantiene dentro delos
espacio de nombres y donde sea que realice la llamada, la gente sabe que espath()
delos
módulo inmediatamente._, extension = os.path.splitext(filename)
es mucho más bonita.if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
Nuevo en la versión 3.4.
Me sorprende que nadie haya mencionado
pathlib
aún, ¡pathlib
ES increíble!Si necesita todos los sufijos (por ejemplo, si tiene un
.tar.gz
), ¡.suffixes
le devolverá una lista!fuente
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
para garantizar que solo obtenga .tar.gz como máximo.Para obtener solo el texto de la extensión, sin el punto.
fuente
Una opción puede estar dividiéndose del punto:
No hay error cuando el archivo no tiene una extensión:
Pero debes tener cuidado:
fuente
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']
con'file.tar.gz'.split('.')
vs['file.tar', 'gz']
con'file.tar.gz'.rsplit('.', 1)
. Sí, podría ser.vale la pena agregar un valor más bajo para que no se pregunte por qué los JPG no aparecen en su lista.
fuente
Cualquiera de las soluciones anteriores funciona, pero en Linux he encontrado que hay una nueva línea al final de la cadena de extensión que evitará que las coincidencias tengan éxito. Agrega el
strip()
método hasta el final. Por ejemplo:fuente
[1:]
en.splittext(filename)[1][1:]
) - gracias de antemanosplittext()
(a diferencia de si divide una cadena usando '.') Incluye el '.' personaje en la extensión. El adicional[1:]
se deshace de él.Con splitext hay problemas con archivos con doble extensión (p
file.tar.gz
. Ej .file.tar.bz2
, Etc.)pero debe ser:
.tar.gz
Las posibles soluciones están aquí
fuente
gunzip somefile.tar.gz
¿Cuál es el nombre de archivo de salida?Puede encontrar algunas cosas excelentes en el módulo pathlib (disponible en python 3.x).
fuente
Aunque es un tema antiguo, pero me pregunto por qué no se menciona una API muy simple de Python llamada rpartition en este caso:
para obtener la extensión de una ruta absoluta de un archivo dado, simplemente puede escribir:
ejemplo:
te dará: 'csv'
fuente
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")
. Si no hay un separador encontrado, la tupla devuelta será:("", "", "the original string")
.Solo
join
todospathlib suffixes
.fuente
Sorprendido, esto no fue mencionado todavía:
Beneficios:
Como función:
fuente
[-1]
entonces.Puede usar un
split
en unfilename
:Esto no requiere una biblioteca adicional
fuente
fuente
filename
se devuelva el último carácter si el nombre de archivo no tiene ninguno.
. Esto se debe a querfind
devuelve-1
si no se encuentra la cadena.Esta es una técnica de representación directa de cadenas: veo muchas soluciones mencionadas, pero creo que la mayoría está buscando dividir. Split, sin embargo, lo hace en cada aparición de "." . Lo que preferirías estar buscando es la partición.
fuente
Otra solución con división correcta:
fuente
Incluso esta pregunta ya está respondida, agregaría la solución en Regex.
fuente
\.[0-9a-z]+$
como en este post .Una verdadera frase, si te gusta la expresión regular. Y no importa incluso si tiene un "." Adicional en el medio
Vea aquí el resultado: haga clic aquí
fuente
Este es el método más simple para obtener tanto el nombre de archivo como la extensión en una sola línea .
A diferencia de otras soluciones, no necesita importar ningún paquete para esto.
fuente
Para divertirse ... solo reúna las extensiones en un dict y realice un seguimiento de todas ellas en una carpeta. Luego simplemente extraiga las extensiones que desee.
fuente
prueba esto:
fuente
foo.tar
es un nombre de archivo válido ¿Qué pasa si le tiro eso a tu código? ¿Qué hay de.bashrc
ofoo
? Hay una función de biblioteca para esto por una razón ...fuente
fuente
Eso le dará el nombre del archivo hasta el primer ".", Que sería el más común.
fuente
file.name.ext