Respuestas:
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', '')
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 es splitExt
o split_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.
import os.path
extension = os.path.splitext(filename)[1]
import os.path
lugar de from os import path
?
from os import path
entonces el nombre path
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 del os
espacio de nombres y donde sea que realice la llamada, la gente sabe que es path()
del os
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.
import pathlib
print(pathlib.Path('yourPath.example').suffix) # '.example'
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!
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
para garantizar que solo obtenga .tar.gz como máximo.
Una opción puede estar dividiéndose del 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
"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.
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:
import os.path
extension = os.path.splitext(filename)[1][1:].strip()
[1:]
en .splittext(filename)[1][1:]
) - gracias de antemano
splittext()
(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.)
>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension
'.gz'
pero debe ser: .tar.gz
Las posibles soluciones están aquí
gunzip somefile.tar.gz
¿Cuál es el nombre de archivo de salida?
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:
filepath.rpartition('.')[-1]
ejemplo:
path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]
te dará: 'csv'
("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")
.
Sorprendido, esto 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:
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
[-1]
entonces.
Puede usar un split
en un filename
:
f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))
Esto no requiere una biblioteca adicional
filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]
filename
se devuelva el último carácter si el nombre de archivo no tiene ninguno .
. Esto se debe a que rfind
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.
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
Otra solución con división correcta:
# 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])
Una verdadera frase, si te gusta la expresión regular. Y no importa incluso si tiene un "." Adicional en el medio
import re
file_ext = re.search(r"\.([^.]+)$", filename).group(1)
Vea aquí el resultado: haga clic aquí
Este es el método más simple para obtener tanto el nombre de archivo como la extensión en una sola línea .
fName, ext = 'C:/folder name/Flower.jpeg'.split('/')[-1].split('.')
>>> print(fName)
Flower
>>> print(ext)
jpeg
A diferencia de otras soluciones, no necesita importar ningún paquete para esto.
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.
import os
search = {}
for f in os.listdir(os.getcwd()):
fn, fe = os.path.splitext(f)
try:
search[fe].append(f)
except:
search[fe]=[f,]
extensions = ('.png','.jpg')
for ex in extensions:
found = search.get(ex,'')
if found:
print(found)
prueba esto:
files = ['file.jpeg','file.tar.gz','file.png','file.foo.bar','file.etc']
pen_ext = ['foo', 'tar', 'bar', 'etc']
for file in files: #1
if (file.split(".")[-2] in pen_ext): #2
ext = file.split(".")[-2]+"."+file.split(".")[-1]#3
else:
ext = file.split(".")[-1] #4
print (ext) #5
foo.tar
es un nombre de archivo válido ¿Qué pasa si le tiro eso a tu código? ¿Qué hay de .bashrc
o foo
? Hay una función de biblioteca para esto por una razón ...
# 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
name_only=file_name[:filename.index(".")
Eso le dará el nombre del archivo hasta el primer ".", Que sería el más común.
file.name.ext
basename
es un poco confuso aquí yaos.path.basename("/path/to/somefile.ext")
que volvería"somefile.ext"