Извлечение расширения из имени файла в 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]