Как получить имя файла без расширения из пути в Python? - PullRequest
766 голосов
/ 24 марта 2009

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

Ответы [ 21 ]

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

Думаю, я бы добавил вариант использования os.path.splitext без необходимости использования индексации массива.

Функция всегда возвращает пару (root, ext), поэтому ее можно безопасно использовать:

root, ext = os.path.splitext(path)

Пример:

>>> import os
>>> path = 'my_text_file.txt'
>>> root, ext = os.path.splitext(path)
>>> root
'my_text_file'
>>> ext
'.txt'
4 голосов
/ 11 января 2017

import os

filename = C:\\Users\\Public\\Videos\\Sample Videos\\wildlife.wmv

Возвращает filename без extension (C: \ Users \ Public \ Videos \ Sample Videos \ wildlife)

temp = os.path.splitext(filename)[0]  

Теперь вы можете получить только filename от температуры с

os.path.basename(temp)   #this returns just the filename (wildlife)
4 голосов
/ 18 октября 2017

Процедура многократного расширения. Работает для путей str и unicode. Работает в Python 2 и 3.

import os

def file_base_name(file_name):
    if '.' in file_name:
        separator_index = file_name.index('.')
        base_name = file_name[:separator_index]
        return base_name
    else:
        return file_name

def path_base_name(path):
    file_name = os.path.basename(path)
    return file_base_name(file_name)

Поведение:

>>> path_base_name('file')
'file'
>>> path_base_name(u'file')
u'file'
>>> path_base_name('file.txt')
'file'
>>> path_base_name(u'file.txt')
u'file'
>>> path_base_name('file.tar.gz')
'file'
>>> path_base_name('file.a.b.c.d.e.f.g')
'file'
>>> path_base_name('relative/path/file.ext')
'file'
>>> path_base_name('/absolute/path/file.ext')
'file'
>>> path_base_name('Relative\\Windows\\Path\\file.txt')
'file'
>>> path_base_name('C:\\Absolute\\Windows\\Path\\file.txt')
'file'
>>> path_base_name('/path with spaces/file.ext')
'file'
>>> path_base_name('C:\\Windows Path With Spaces\\file.txt')
'file'
>>> path_base_name('some/path/file name with spaces.tar.gz.zip.rar.7z')
'file name with spaces'
2 голосов
/ 19 августа 2013

В системе Windows я также использовал префикс drivername, например:

>>> s = 'c:\\temp\\akarmi.txt'
>>> print(os.path.splitext(s)[0])
c:\temp\akarmi

Так как мне не нужна буква диска или имя каталога, я использую:

>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi
2 голосов
/ 28 мая 2015
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
1 голос
/ 21 апреля 2019

Для максимальной эзотерики:

def strip_suffix(filename):
    """
    >>> video.mp4
    video

    >>> video.extra.mp4
    video.extra
    """
    return ''.join((name_dot[0] + name_dot[1] for name_dot in itertools.zip_longest(filename.split('.')[0:-1], '.', fillvalue='.')))[0:-1]

Примечание: это просто для удовольствия. Не используйте это. Используйте os.path.splitext вместо

1 голос
/ 10 января 2015

Мы могли бы сделать простую магию split / pop, как показано здесь (https://stackoverflow.com/a/424006/1250044),, чтобы извлечь имя файла (с учетом различия окон и POSIX).

def getFileNameWithoutExtension(path):
  return path.split('\\').pop().split('/').pop().rsplit('.', 1)[0]

getFileNameWithoutExtension('/path/to/file-0.0.1.ext')
# => file-0.0.1

getFileNameWithoutExtension('\\path\\to\\file-0.0.1.ext')
# => file-0.0.1
1 голос
/ 24 октября 2017

Самый простой способ решить эту проблему -

import ntpath 
print('Base name is ',ntpath.basename('/path/to/the/file/'))

это экономит ваше время и затраты на вычисления.

1 голос
/ 01 июня 2017
import os
list = []
def getFileName( path ):
for file in os.listdir(path):
    #print file
    try:
        base=os.path.basename(file)
        splitbase=os.path.splitext(base)
        ext = os.path.splitext(base)[1]
        if(ext):
            list.append(base)
        else:
            newpath = path+"/"+file
            #print path
            getFileName(newpath)
    except:
        pass
return list

getFileName("/home/weexcel-java3/Desktop/backup")
print list
0 голосов
/ 11 июня 2019

Другие методы не удаляют несколько расширений. У некоторых также есть проблемы с именами файлов, которые не имеют расширений. Этот фрагмент работает с обоими экземплярами и работает как в Python 2, так и в 3. Он извлекает базовое имя из пути, разбивает значение на точки и возвращает первое, которое является начальной частью имени файла.

import os

def get_filename_without_extension(file_path):
    file_basename = os.path.basename(file_path)
    filename_without_extension = file_basename.split('.')[0]
    return filename_without_extension

Вот несколько примеров для запуска:

example_paths = [
    "FileName", 
    "./FileName",
    "../../FileName",
    "FileName.txt", 
    "./FileName.txt.zip.asc",
    "/path/to/some/FileName",
    "/path/to/some/FileName.txt",
    "/path/to/some/FileName.txt.zip.asc"
]

for example_path in example_paths:
    print(get_filename_without_extension(example_path))

В каждом случае напечатанное значение равно:

FileName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...