importar - archivos en python 3
Extrayendo la extensión del nombre de archivo en Python (20)
Aunque es un tema antiguo, me pregunto por qué no hay ninguna que mencione una api muy simple de python llamada rpartition en este caso:
para obtener la extensión de una ruta absoluta de archivo dada, simplemente puede escribir:
filepath.rpartition(''.'')[-1]
ejemplo:
path = ''/home/jersey/remote/data/test.csv''
print path.rpartition(''.'')[-1]
te dará: ''csv''
¿Existe una función para extraer la extensión de un nombre de archivo?
Con splitext hay problemas con los archivos con extensión doble (por ejemplo, file.tar.bz2
, file.tar.bz2
, etc.)
>>> fileName, fileExtension = os.path.splitext(''/path/to/somefile.tar.gz'')
>>> fileExtension
''.gz''
pero debería ser: .tar.gz
Las posibles soluciones están here
Cualquiera de las soluciones anteriores funciona, pero en linux encontré que hay una nueva línea al final de la cadena de extensión que evitará que las coincidencias tengan éxito. Agrega el método strip()
al final. Por ejemplo:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
Esta es una técnica de representación directa de cadenas: veo que se mencionan muchas soluciones, pero creo que la mayoría busca dividir. Split, sin embargo, lo hace en cada aparición de "." . Lo que preferirías estar buscando es la partición.
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
Incluso esta pregunta ya está respondida, agregaría la solución en Regex.
>>> import re
>>> file_suffix = ".*(/..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
''.ext''
Otra solución con split correcto:
# 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])
Puede utilizar una split
en un filename
:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
Esto no requiere biblioteca adicional.
Puedes encontrar algunas cosas geniales en el módulo pathlib.
import pathlib
x = pathlib.PurePosixPath("C://Path//To//File//myfile.txt").suffix
print(x)
# Output
''.txt''
Solo join
todos los 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''
Sorprendido esto aún no se mencionó:
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 ocurra.
- Sin modulos
- No regex
- Multiplataforma
- Fácilmente extensible (por ejemplo, sin puntos iniciales para la extensión, solo la última parte de la extensión)
Como función:
def get_extension(filename):
basename = os.path.basename(filename) # os independent
ext = ''.''.join(basename.split(''.'')[1:])
return ''.'' + ext if ext else None
Una opción puede ser dividir desde un punto:
>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
''jpeg''
No hay error cuando el archivo no tiene una extensión:
>>> "filename".split(".")[-1]
''filename''
Pero debes tener cuidado:
>>> "png".split(".")[-1]
''png'' # But file doesn''t have an extension
vale la pena agregar un valor más bajo para que no se pregunte por qué los JPG no aparecen en su lista.
os.path.splitext(filename)[1][1:].strip().lower()
Nuevo en la versión 3.4.
import pathlib
print(pathlib.Path(''yourPathGoesHere'').suffix)
Me sorprende que nadie haya mencionado pathlib
todavía, ¡ pathlib
ES increíble!
Si necesita todos los sufijos (por ejemplo, si tiene un .tar.gz
), .suffixes
le devolverá una lista de ellos.
Sí. Utilice 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
tratará correctamente a /a/bc/d
como si no tuviera extensión en lugar de tener la extensión .c/d
, y tratará a .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'', '''')
# 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 ""
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
filename=''ext.tar.gz''
extension = filename[filename.rfind(''.''):]
import os.path
extension = os.path.splitext(filename)[1]
import os.path
extension = os.path.splitext(filename)[1][1:]
Para obtener solo el texto de la extensión, sin el punto.
name_only=file_name[:filename.index(".")
Eso le dará el nombre del archivo hasta el primer ".", Que sería el más común.