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

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

Ответ 1

Получение имени файла без расширения:

import os
print(os.path.splitext("/path/to/some/file.txt")[0])

Печать:

/path/to/some/file

Важное примечание: если имя файла имеет несколько точек, удаляется только расширение после последней. Например:

import os
print(os.path.splitext("/path/to/some/file.txt.zip.asc")[0])

Печать:

/path/to/some/file.txt.zip

Смотрите другие ответы ниже, если вам нужно разобраться с этим делом.

Ответ 2

Вы можете сделать свой собственный с:

>>> import os
>>> base=os.path.basename('/root/dir/sub/file.ext')
>>> base
'file.ext'
>>> os.path.splitext(base)
('file', '.ext')
>>> os.path.splitext(base)[0]
'file'

Важное примечание: если их несколько . в имени файла удаляется только последний. Например:

/root/dir/sub/file.ext.zip -> file.ext

/root/dir/sub/file.ext.tar.gz -> file.ext.tar

Ниже приведены другие ответы, которые касаются этого.

Ответ 3

>>> print(os.path.splitext(os.path.basename("hemanth.txt"))[0])
hemanth

Ответ 4

Использование pathlib в Python 3. 4+

from pathlib import Path

Path('/root/dir/sub/file.ext').stem

вернется

file

Ответ 5

В Python 3. 4+ вы можете использовать pathlib решение

from pathlib import Path

print(Path(your_path).resolve().stem)

Ответ 6

Если вы хотите сохранить путь к файлу и просто удалить расширение

>>> file = '/root/dir/sub.exten/file.data.1.2.dat'
>>> print ('.').join(file.split('.')[:-1])
/root/dir/sub.exten/file.data.1.2

Ответ 7

os.path.splitext() не будет работать, если в расширении есть несколько точек.

Например, images.tar.gz

>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> print os.path.splitext(file_name)[0]
images.tar

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

>>> import os
>>> file_path = '/home/dc/images.tar.gz'
>>> file_name = os.path.basename(file_path)
>>> index_of_dot = file_name.index('.')
>>> file_name_without_extension = file_name[:index_of_dot]
>>> print file_name_without_extension
images

Ответ 8

https://docs.python.org/3/library/os.path.html

В python 3 pathlib "Модуль pathlib предлагает высокоуровневые объекты пути". так,

>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c

Ответ 9

@IceAdor ссылается на rsplit в комментарии к решению @user2902201. rsplit - это самое простое решение, поддерживающее несколько периодов.

Здесь написано:

file = 'my.report.txt'
print file.rsplit('.', 1)[0]

my.report

Ответ 10

Но даже когда я импортирую os, я не могу назвать его path.basename. Можно ли назвать это непосредственно как basename?

import os, а затем используйте os.path.basename

import ing os не означает, что вы можете использовать os.foo без ссылки на os.

Ответ 11

Думаю, я бы добавил вариант использования 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'

Ответ 12

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 от temp с помощью

os.path.basename(temp)   #this returns just the filename (wildlife)

Ответ 13

Процедура с несколькими расширениями. Работает для путей 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'

Ответ 14

Другие методы не удаляют несколько расширений. У некоторых также есть проблемы с именами файлов, которые не имеют расширений. Этот фрагмент имеет дело с обоими экземплярами и работает как в 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

Ответ 15

В системе 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

Ответ 16

import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]

Ответ 17

Мы могли бы сделать небольшую магию split/pop, как показано здесь (fooobar.com/questions/16186/...), чтобы извлечь имя файла (с учетом различий в Windows и 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

Ответ 18

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

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

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

Ответ 19

импорт ОС имя файла, file_extension = os.path.splitext('/d1/d2/example.cs') имя файла '/d1/d2/example' file_extension - это ".cs"

Ответ 20

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

def filename(path):
  """Return file name without extension from path.

  See https://docs.python.org/3/library/os.path.html
  """
  import os.path
  b = os.path.split(path)[1]  # path, *filename*
  f = os.path.splitext(b)[0]  # *file*, ext
  #print(path, b, f)
  return f

Протестировано с помощью Python 3.5.

Ответ 21

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

Ответ 22

Чтобы получить максимальную эзотерику, весело провести время и немного узнать о itertools:

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

Ответ 23

Я думаю, что самый простой способ - это использовать .split("/")

input= "PATH/TO/FILE/file.txt" file_only = input.split("/")[-1] print(file_only)

>>> file.txt

Вы также можете сделать это, чтобы извлечь последнюю папку:

input= "PATH/TO/FOLDER" folder_only = input.split("/")[-1] print(folder_only)

>>> FOLDER

Если вы хотите предпоследнюю папку, просто измените [-1] на [-2].

Ответ 24

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

print fileName[0:-4]