2011-05-08 9 views
11

Estoy trabajando en python con os.path.splitext() y me resulta curioso si es posible separar nombres de archivos de extensiones con múltiples "."? p.ej. "foobar.aux.xml" utilizando splitext. Los nombres de archivo varían desde [foobar, foobar.xml, foobar.aux.xml]. ¿Hay una mejor manera?Separación de extensiones de archivos mediante el módulo python os.path

+2

@ Nick, no del todo. Él quiere manejar nombres de archivo con múltiples extensiones. –

+0

'os.path.splitext()' dividirá correctamente '" foobar.aux.xml "' en '" foobar.aux "' y '" .xml "'. ¿Quieres/necesitas algo más? – martineau

Respuesta

19

dividido con os.extsep.

>>> import os 
>>> 'filename.ext1.ext2'.split(os.extsep) 
['filename', 'ext1', 'ext2'] 

Si usted quiere todo después de que el primer punto:

>>> 'filename.ext1.ext2'.split(os.extsep, 1) 
['filename', 'ext1.ext2'] 

Si está utilizando caminos con los directorios que pueden contener puntos:

>>> def my_splitext(path): 
...  """splitext for paths with directories that may contain dots.""" 
...  li = [] 
...  path_without_extensions = os.path.join(os.path.dirname(path), os.path.basename(path).split(os.extsep)[0]) 
...  extensions = os.path.basename(path).split(os.extsep)[1:] 
...  li.append(path_without_extensions) 
...  # li.append(extensions) if you want extensions in another list inside the list that is returned. 
...  li.extend(extensions) 
...  return li 
... 
>>> my_splitext('/path.with/dots./filename.ext1.ext2') 
['/path.with/dots./filename', 'ext1', 'ext2'] 
+2

O 'os.path.extsep' si eso resulta conveniente. –

+0

@Artur Gaspar: ¿es esto posible sin saber la cadena exacta? Entonces, ¿podría separar todos los archivos en un directorio o con un comodín? – KennyC

+0

@KennyC Debería funcionar para todos los nombres de archivos sin la ruta completa (solo nombre de archivo). La función my_splitext que agregué a la respuesta debería funcionar con todas las rutas. Si quieres comodines debes usar el módulo 'glob'. –

5

podría intentar con:

names = pathname.split('.') 
filename = names[0] 
extensions = names[1:] 

si desea utilizar splitext, se puede usar algo como:

import os 

path = 'filename.es.txt' 

while True: 
    path, ext = os.path.splitext(path) 
    if not ext: 
     print path 
     break 
    else: 
     print ext 

produce:

.txt 
.es 
filename 
2

De la ayuda de la función:

La extensión es todo desde el último punto hasta el final, ignorando los puntos iniciales.

Así que la respuesta es no, no puede hacerlo con esta función.

1

Si desea dividir fuera de cualquier número de extensiones al final, puede crear una función como esta:

def splitext_recurse(p): 
    base, ext = os.path.splitext(p) 
    if ext == '': 
     return (base,) 
    else: 
     return splitext_recurse(base) + (ext,) 

y usarlo de esta manera:

>>> splitext_recurse("foobar.aux.xml") 
('foobar', '.aux', '.xml') 
+0

El proceso es aproximadamente el mismo si solo quiere una extensión larga, como '('foobar', '.aux.xml')'. –

Cuestiones relacionadas