Извлечение расширения из имени файла в Python - PullRequest
1065 голосов
/ 12 февраля 2009

Есть ли функция для извлечения расширения из имени файла?

Ответы [ 20 ]

1660 голосов
/ 12 февраля 2009

Да. Используйте os.path.splitext (см. Документация Python 2.X или Документация Python 3.X ):

>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'

В отличие от большинства попыток ручного разделения строк, os.path.splitext будет правильно обрабатывать /a/b.c/d как не имеющее расширения вместо расширения .c/d, и .bashrc будет иметь отсутствие расширения вместо расширения .bashrc :

>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
350 голосов
/ 12 февраля 2009
import os.path
extension = os.path.splitext(filename)[1]
137 голосов
/ 04 февраля 2016

Новое в версии 3.4.

import pathlib

print(pathlib.Path('yourPathGoesHere').suffix)

Я удивлен, что никто еще не упомянул pathlib, pathlib КРАСНО!

Если вам нужны все суффиксы (например, если у вас есть .tar.gz), .suffixes вернет их список!

94 голосов
/ 26 августа 2011
import os.path
extension = os.path.splitext(filename)[1][1:]

Получить только текст расширения, без точки.

65 голосов
/ 09 апреля 2012

Одна опция может быть расщеплена от точки:

>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'

Нет ошибки, если файл не имеет расширения:

>>> "filename".split(".")[-1]
'filename'

Но вы должны быть осторожны:

>>> "png".split(".")[-1]
'png'    # But file doesn't have an extension
33 голосов
/ 28 декабря 2012

стоит добавить ниже, чтобы вы не задавались вопросом, почему JPG не отображаются в вашем списке.

os.path.splitext(filename)[1][1:].strip().lower()
14 голосов
/ 11 октября 2011

Любое из приведенных выше решений работает, но в linux я обнаружил, что в конце строки расширения есть новая строка, которая будет препятствовать успешному совпадению. Добавьте метод strip() до конца. Например:

import os.path
extension = os.path.splitext(filename)[1][1:].strip() 
13 голосов
/ 05 февраля 2013

При использовании splitext возникают проблемы с файлами с двойным расширением (например, file.tar.gz, file.tar.bz2 и т. Д.)

>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension 
'.gz'

но должно быть: .tar.gz

Возможные решения здесь

10 голосов
/ 27 февраля 2017

Хотя это старая тема, но мне интересно, почему никто не упоминает очень простой API Python под названием rpartition в этом случае:

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

filepath.rpartition('.')[-1]

пример:

path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]

даст вам: 'CSV'

8 голосов
/ 20 декабря 2015

Удивлен, это еще не упоминалось:

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

Преимущества:

  • Работает, как и ожидалось, для всего, что я могу придумать
  • Нет модулей
  • Нет регулярных выражений
  • Кроссплатформенность
  • Легко расширяется (например, без начальных точек для расширения, только последняя часть расширения)

Как функция:

def get_extension(filename):
    basename = os.path.basename(filename)  # os independent
    ext = '.'.join(basename.split('.')[1:])
    return '.' + ext if ext else None
...