Pregunta

¿Hay una función para extraer la extensión de un nombre de archivo?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top