Как правильно получить расширение файла?

Я знаю, что этот вопрос задают много раз на этом сайте. Но я обнаружил, что они пропустили важный момент: только расширение файла с одним периодом считалось как *.png *.mp3, но как я могу справиться с этим именем файла с двумя периодами, такими как .tar.gz.

Базовый код:

filename = '/home/lancaster/Downloads/a.ppt'
extention = filename.split('/')[-1]

Но, очевидно, этот код не работает с файлом типа a.tar.gz. Как с этим бороться? Спасибо.

Ответ 1

Роль расширения файла заключается в том, чтобы сообщить наблюдателю (а иногда и компьютеру), какое приложение использовать для обработки файла.

Принимая ваш наихудший пример в ваших комментариях (a.ppt.tar.gz), это файл PowerPoint, который был tar-balled, а затем gzipped. Поэтому вам нужно использовать программу обработки gzip для ее открытия. Использование PowerPoint или программы обработки tarball не будет работать. Хорошо, умная программа, которая умела обрабатывать файлы .tar и .gz, могла понимать обе операции и работать с файлом .tar.gz, но обратите внимание, что это будет сделано, даже если расширение было просто .gz.

Тот факт, что как tar, так и gzip добавляет их расширения к исходному имени файла, а не заменяет их (как zip), является удобством. Но базовое имя файла gzip по-прежнему a.ppt.tar.

Ответ 2

Python 3.4

Теперь вы можете использовать Path из pathlib. Он имеет множество функций, один из которых suffix:

>>> from pathlib import Path
>>> Path('my/library/setup.py').suffix
'.py'
>>> Path('my/library.tar.gz').suffix
'.gz'
>>> Path('my/library').suffix
''

Если вы хотите получить более одного суффикса, используйте suffixes:

>>> from pathlib import Path
>>> Path('my/library.tar.gar').suffixes
['.tar', '.gar']
>>> Path('my/library.tar.gz').suffixes
['.tar', '.gz']
>>> Path('my/library').suffixes
[]

Ответ 3

Вот модуль сборки в os. Подробнее о os.path.splitext.

In [1]: from os.path import splitext
In [2]: file_name,extension = splitext('/home/lancaster/Downloads/a.ppt')
In [3]: extension
Out[1]: '.ppt'

Если вам нужно ограничить расширение .tar.gz, .tar.bz2, вам нужно написать такую ​​функцию, как этот

from os.path import splitext
def splitext_(path):
    for ext in ['.tar.gz', '.tar.bz2']:
        if path.endswith(ext):
            return path[:-len(ext)], path[-len(ext):]
    return splitext(path)

Результат

In [4]: file_name,ext = splitext_('/home/lancaster/Downloads/a.tar.gz')
In [5]: ext
Out[2]: '.tar.gz'

Edit

Как правило, вы можете использовать эту функцию

from os.path import splitext
def splitext_(path):
    if len(path.split('.')) > 2:
        return path.split('.')[0],'.'.join(path.split('.')[-2:])
    return splitext(path)

Он будет работать для всех расширений.

Работа со всеми файлами.

In [6]: inputs = ['a.tar.gz', 'b.tar.lzma', 'a.tar.lz', 'a.tar.lzo', 'a.tar.xz','a.png']
In [7]: for file_ in inputs:                                                                    
    file_name,extension = splitext_(file_)
    print extension
   ....:     
tar.gz
tar.lzma
tar.lz
tar.lzo
tar.xz
.png

Ответ 4

Один из возможных способов:

  • Нарезка на "." = > tmp_ext = filename.split('.')[1:]

Результат - это список = ['tar', 'gz']

  1. Присоединяйтесь к ним вместе = > extention = ".".join(tmp_ext)

Результат - это расширение как строка = 'tar.gz'

Обновление: Пример:

>>> test = "/test/test/test.tar.gz"
>>> t2 = test.split(".")[1:]
>>> t2
['tar', 'gz']
>>> ".".join(t2)
'tar.gz'

Ответ 5

Самый простой:

import os.path
print os.path.splitext("/home/lancaster/Downloads/a.ppt")[1]
# '.ppt'

Ответ 6

>>> import os
>>> import re

>>> filename = os.path.basename('/home/lancaster/Downloads/a.ppt')  
>>> extensions = re.findall(r'\.([^.]+)', basename)
['ppt']


>>> filename = os.path.basename('/home/lancaster/Downloads/a.ppt.tar.gz')  
>>> extensions = re.findall(r'\.([^.]+)', basename)
['ppt','tar','gz']

Ответ 7

with re.findall and python 3.6

filename = '/home/Downloads/abc.ppt.tar.gz'

ext = r'\.\w{1,6}'

re.findall(f'{ext}\\b | {ext}$', filename,  re.X)

['.ppt', '.tar', '.gz']

Ответ 8

from os.path import split, splitext

path = '/path/to/source/file.zip'

dir_path, raw_file = split(path)
file, file_extension = splitext(raw_file)

print(f"dir_path: {dir_path} | file: {raw_file}")
print(f"file name: {file} | file extension: {file_extension}")

output:

dir_path: /path/to/source | file: file.zip
file name: file | file extension: .zip

Ответ 9

filename = '/home/lancaster/Downloads/a.tar.gz'
extention = filename.split('/')[-1]

if '.' in extention:
  extention = extention.split('.')[-1]
  if len(extention) > 0:
    extention = '.'+extention
    print extention