Вопрос

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

Это было полезно?

Решение

ДА.Использование 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', '')

Другие советы

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

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

import pathlib

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

Я удивлен, что никто не упомянул pathlib пока, pathlib ЭТО потрясающе!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Возможными решениями являются здесь

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

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

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

пример:

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

даст тебе:"csv" - файл

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

Удивлен, что об этом еще не упомянули:

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

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

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

# Output 
'.txt'

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

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

Для этого не требуется дополнительная библиотека

Просто 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'

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

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

Другое решение с правильным разделением:

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

Даже если на этот вопрос уже дан ответ, я бы добавил решение в регулярное выражение.

>>> import re
>>> file_suffix = ".*(\..*)"
>>> result = re.search(file_suffix, "somefile.ext")
>>> result.group(1)
'.ext'
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
# 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 ""
name_only=file_name[:filename.index(".")

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top