La extracción de extensión de nombre de archivo en Python
-
23-08-2019 - |
Pregunta
¿Hay una función para extraer la extensión de un nombre de archivo?
Solución
Sí. Utilice os.path.splitext
(ver Python 2.X documentación o 3.X Python documentación ):
>>> 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 de división de cadena manuales, os.path.splitext
tratará correctamente /a/b.c/d
como tener ninguna extensión en lugar de tener la extensión .c/d
, y va a tratar .bashrc
como tener ninguna extensión en lugar de tener la extensión .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
Otros consejos
import os.path
extension = os.path.splitext(filename)[1]
Nuevo en la versión 3.4.
import pathlib
print(pathlib.Path('yourPathGoesHere').suffix)
Me sorprende que nadie ha mencionado pathlib
sin embargo, es impresionante pathlib
!
Si necesita todos los sufijos (por ejemplo, si tiene un .tar.gz
), .suffixes
devolverá una lista de ellos!
import os.path
extension = os.path.splitext(filename)[1][1:]
Para obtener únicamente el texto de la extensión, sin el punto.
Una opción puede ser La división de puntos:
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'
No hay error cuando el archivo no tiene una extensión:
>>> "filename".split(".")[-1]
'filename'
Pero hay que tener cuidado:
>>> "png".split(".")[-1]
'png' # But file doesn't have an extension
pena añadir un menor en ese país por lo que no se encuentra el preguntarse por qué el JPG de no aparecen en la lista.
os.path.splitext(filename)[1][1:].strip().lower()
Cualquiera de las soluciones anteriores trabajos, pero en Linux he encontrado que hay una nueva línea al final de la cadena de extensión, lo que impide partidos de tener éxito. Añadir el método strip()
hasta el final. Por ejemplo:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
Con splitext hay problemas con los archivos con doble extensión (por ejemplo file.tar.gz
, file.tar.bz2
, etc ..)
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
pero debe ser: .tar.gz
Las posibles soluciones se aquí
A pesar de que es un viejo tema, pero me pregunto por qué no hay ninguna mención de un API muy simple de Python llamada rpartition en este caso:
para obtener la extensión de un archivo dado ruta absoluta, simplemente puede escribir:
filepath.rpartition('.')[-1]
ejemplo:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
le dará: 'csv'
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
Me sorprendió este no fue mencionado todavía:
import os
fn = '/some/path/a.tar.gz'
basename = os.path.basename(fn) # os independent
Out[] a.tar.gz
base = basename.split('.')[0]
Out[] a
ext = '.'.join(basename.split('.')[1:]) # <-- main part
# if you want a leading '.', and if no result `None`:
ext = '.' + ext if ext else None
Out[] .tar.gz
Beneficios:
- funciona como se espera para cualquier cosa que se me ocurre
- No hay módulos
- No hay expresiones regulares
- Compatibilidad con múltiples plataformas
- fácilmente extensibles (por ejemplo, no hay puntos principales para extensión, solamente última parte de extensión)
Función:
def get_extension(filename):
basename = os.path.basename(filename) # os independent
ext = '.'.join(basename.split('.')[1:])
return '.' + ext if ext else None
Puede encontrar algunas grandes cosas en el módulo pathlib.
import pathlib
x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix
print(x)
# Output
'.txt'
Puede utilizar un split
en un filename
:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
Esto no requiere biblioteca adicional
Sólo join
todo pathlib suffixes
.
>>> x = 'file/path/archive.tar.gz'
>>> y = 'file/path/text.txt'
>>> ''.join(pathlib.Path(x).suffixes)
'.tar.gz'
>>> ''.join(pathlib.Path(y).suffixes)
'.txt'
Esta es una representación de cadena directos técnicas: Veo una gran cantidad de soluciones mencionadas, pero creo que la mayoría están mirando dividida. Dividir sin embargo lo hace en cada aparición de "" . Lo que usted prefiere buscar es la partición.
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
Otra solución con split derecha:
# to get extension only
s = 'test.ext'
if '.' in s: ext = s.rsplit('.', 1)[1]
# or, to get file name and extension
def split_filepath(s):
"""
get filename and extension from filepath
filepath -> (filename, extension)
"""
if not '.' in s: return (s, '')
r = s.rsplit('.', 1)
return (r[0], r[1])
A pesar de esta pregunta ya está contestada me gustaría añadir la solución en expresiones regulares.
>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'
def NewFileName(fichier):
cpt = 0
fic , *ext = fichier.split('.')
ext = '.'.join(ext)
while os.path.isfile(fichier):
cpt += 1
fichier = '{0}-({1}).{2}'.format(fic, cpt, ext)
return fichier
# try this, it works for anything, any length of extension
# e.g www.google.com/downloads/file1.gz.rs -> .gz.rs
import os.path
class LinkChecker:
@staticmethod
def get_link_extension(link: str)->str:
if link is None or link == "":
return ""
else:
paths = os.path.splitext(link)
ext = paths[1]
new_link = paths[0]
if ext != "":
return LinkChecker.get_link_extension(new_link) + ext
else:
return ""
name_only=file_name[:filename.index(".")
Esto le dará el nombre de archivo hasta la primera "", que sería la más común.