Разделение расширений файлов с помощью модуля python os.path

Я работаю на python с os.path.splitext() и любопытно, можно ли отделить имена файлов от расширений с несколькими "."? например "foobar.aux.xml" с использованием splitext. Имена файлов варьируются от [foobar, foobar.xml, foobar.aux.xml]. Есть ли способ лучше?

Ответ 1

Разделить на os.extsep.

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

Если вы хотите все после первой точки:

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

Если вы используете пути с каталогами, которые могут содержать точки:

>>> 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

вы можете попробовать:

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

если вы хотите использовать splitext, вы можете использовать что-то вроде:

import os

path = 'filename.es.txt'

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

дает:

.txt
.es
filename

Ответ 3

С помощью функции:

Расширение - это все, начиная с последнего точка до конца, игнорируя ведущие точки.

Таким образом, ответ отрицательный, вы не можете сделать это с помощью этой функции.

Ответ 4

Если вы хотите отделить любое количество расширений в конце, вы можете создать такую ​​функцию:

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

и используйте его так:

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