Извлечение расширения из имени файла в Python

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

Ответы

Ответ 1

Да. Используйте 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, os.path.splitext будет корректно обрабатывать /a/bc/d как не имеющее расширения вместо расширения .c/d, а .bashrc как не имеющее расширения вместо расширения .bashrc:

>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')

Ответ 2

import os.path
extension = os.path.splitext(filename)[1]

Ответ 3

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

import pathlib

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

Я удивлен, что никто не упомянул pathlib, pathlib !

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

Ответ 4

import os.path
extension = os.path.splitext(filename)[1][1:]

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

Ответ 5

Один параметр может быть разделен на точку:

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

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

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

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

>>> "png".split(".")[-1]
'png'    # But file doesn't have an extension

Ответ 6

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

os.path.splitext(filename)[1][1:].strip().lower()

Ответ 7

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

import os.path
extension = os.path.splitext(filename)[1][1:].strip() 

Ответ 8

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

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

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

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

Ответ 9

Хотя это старая тема, но мне интересно, почему в этом случае не упоминается очень простой api python, называемый rpartition:

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

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

Пример:

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

даст вам: 'csv'

Ответ 10

filename='ext.tar.gz'
extension = filename[filename.rfind('.'):]

Ответ 11

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

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

Ответ 12

Вы можете найти некоторые замечательные вещи в модуле pathlib.

import pathlib
x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix
print(x)

# Output 
'.txt'

Ответ 13

Вы можете использовать split на filename:

f_extns = filename.split(".")
print ("The extension of the file is : " + repr(f_extns[-1]))

Это не требует дополнительной библиотеки

Ответ 14

Просто join ко pathlib suffixes.

>>> x = 'file/path/archive.tar.gz'
>>> y = 'file/path/text.txt'
>>> ''.join(pathlib.Path(x).suffixes)
'.tar.gz'
>>> ''.join(pathlib.Path(y).suffixes)
'.txt'

Ответ 15

Это техника прямого представления строк: я вижу много упомянутых решений, но я думаю, что большинство смотрит на разделение. Сплит, однако, делает это при каждом появлении "." , То, что вы бы предпочли, это раздел.

string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]

Ответ 16

Другое решение с правом расщепления:

# 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])

Ответ 17

Даже этот вопрос уже ответил. Я добавлю решение в Regex.

>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'

Ответ 18

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

Ответ 19

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

Ответ 20

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

Ответ 21

name_only=file_name[:filename.index(".")

Это даст вам имя файла до первого ".", который будет наиболее распространенным.

Ответ 22

Если вам известно точное расширение файла, например file.txt то вы можете использовать

  

напечатать имя_файла [0: -4]