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


Ответы:


1317

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

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

Печать:

/path/to/some/file

Документация дляos.path.splitext .

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

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

Печать:

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

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


13
Если это достаточно распространенная операция, возможно, она заслуживает официальной команды? Что-то вроде os.path.filename (path_to_file) вместо os.path.splitext (os.path.basename (path_to_file)) [0]
Fnord

19
Что если имя файла содержит несколько точек?
matteok

101
Для тех, кто интересуется тем же, что и matteok, если есть несколько точек, сплиттекст разделяется на последнюю (так splitext('kitty.jpg.zip')дает ('kitty.jpg', '.zip')).
Чак

50
Обратите внимание, что этот код возвращает полный путь к файлу (без расширения), а не только имя файла .
Аран-Фей

2
да, так что вы должны будете сделать splitext(basename('/some/path/to/file.txt'))[0](что я всегда делаю)
CpILL

534

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

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

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


2
@ScottWilson: Вам все равно придется импортировать os.
LarsH

35
Что значит «накатить»?
LarsH

50
Это сокращенно от слова «катайся сам», что в американском английском означает «сделай сам».
Скотт С. Уилсон

2
@ Алан У. Смит, «Просто брось это», работал отлично в течение последних 10 лет. Что значит «менее американский»? Я не за ваши правки.
Logic1

5
редактирование делает это более ясным. не у всех английский является
родным

328

Использование pathlibв Python 3.4+

from pathlib import Path

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

вернусь

'file'

9
Это рекомендуемый способ начиная с питона 3.
Miladiouss

1
Обратите внимание, что, как и os.pathрешения, это удалит только одно расширение (или suffix, как pathlibего называют). Path('a.b.c').stem == 'a.b'
BallpointBen

@BallpointBen, каков оптимальный способ удаления нескольких суффиксов? Наверняка должен быть лучший путь, чемPath(Path('a.b.c').stem).stem
хоан

1
@ Хоан, я думаю, что многократные звонки .with_suffix('')- это путь. Вы, вероятно , хотите , чтобы петли до p.suffix == ''.
BallpointBen

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

7
+1 за это. 3 точно таких же ответа, но это самый прямой. Вы просто могли бы использовать `для показа кода и "/somepath/hermanth.txt" в качестве экземпляра пути.
Cregox

2
@ hemanth.hm Обратите внимание, что в этом заявлении, которое вы предоставили, os.path.basenameнет необходимости. os.path.basenameдолжен использоваться только для получения имени файла из пути к файлу.
arrt_

74

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

from pathlib import Path

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

4
Зачем тебе resolve()путь? Действительно ли возможно получить путь к файлу, и если имя файла не будет частью пути без этого? Это означает, что если вы дадите путь к символической ссылке, вы вернете имя файла (без расширения) файла, на который указывает символическая ссылка.
Борис

1
Одна из возможных причин resolve()- помочь справиться с проблемой множественных точек. Ответ ниже об использовании индекса не будет работать, если путь «./foo.tar.gz»
Уильям Оллкок

30

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

1
Это лучшее решение Python 3 для общего случая удаления расширения из полного пути. Использование ствола также удаляет родительский путь. Если вы ожидаете двойное расширение (например, bla.tar.gz), вы можете даже использовать его дважды: p.with_suffix (''). With_suffix ('').
Eelco van Vliet

24

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

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

16
Если вы хотите разделить на последний период, используйте rsplit:'/root/dir/sub.exten/file.data.1.2.dat'.rsplit('.', 1)
IceArdor

21

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

1
index_of_dot = file_name.index ('.') Это будет сделано после получения базового имени файла, чтобы он не разделялся в .env
Chakravarthi

2
Важный момент, так как ряд таких расширений является обычным явлением. .tar.gz .tar.bz .tar.7z

2
Обратите внимание, что 'haystack'.index('needle')генерируется исключение ValueError, если стрелка (в приведенном выше случае точка .) не найдена в стоге сена. Файлы без каких-либо расширений тоже существуют.
Chechnology

15

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

Здесь это прописано:

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

мой отчет


13

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

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

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


1
хотя, если вы хотите вызвать foo напрямую, вы можете использовать from os import foo.
tgray

у вас очень нестандартная версия osмодуля, если у него есть член foo.
Тадхг Макдональд-Дженсен

2
Это имя заполнителя. (например, рассмотреть pathили walk).
Девин Жанпьер

13

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

os.path.splittext () - версия 3.6+
Измир Рамирес

6

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

За исключением добавленной стоимости обработки нескольких точек, этот метод намного быстрее, чем Path('/path/to/file.txt').stem. (1,23 мкс против 8,39 мкс)
raratiru

Это не работает для имени файла nvdcve-1.1-2002.json.zip
Мишель

Я разделил его на fileBasename.split ('. Json') [0], и это сработало
Мишель

4

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)

3

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


0

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

0

Для удобства используется простая функция, заключающая в себе два метода 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.



0

Очень очень очень просто нет других модулей!

import os
p = r"C:\Users\bilal\Documents\face Recognition python\imgs\northon.jpg"

# Get the filename only from the initial file path.
filename = os.path.basename(p)

# Use splitext() to get filename and extension separately.
(file, ext) = os.path.splitext(filename)

# Print outcome.
print("Filename without extension =", file)
print("Extension =", ext)

-1

Мы могли бы сделать что-нибудь простое 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

os.path.splitext () [0] делает то же самое.
Чарльз Плагер

@CharlesPlager os.path.splitext () не будет работать, если в расширении несколько точек. stackoverflow.com/a/37760212/1250044
yckart

Это работает для меня: в [72]: os.path.splitext ('one.two.three.ext') Out [72]: ('one.two.three', '.ext')
Чарльз Плагер

-1
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

-3

импортировать имя файла, file_extension = os.path.splitext ('/ d1 / d2 / example.cs') имя файла равно '/ d1 / d2 / example' file_extension равно '.cs'

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.