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

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

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

19 ответов


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

import os
print(os.path.splitext("path_to_file")[0])

Что касается вашей проблемы импорта, вы решаете ее следующим образом:

from os.path import basename

# now you can call it directly with basename
print(basename("/a/b/c.txt"))

просто свернуть его:

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

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

читаемая версия, используя Pathlib в Python 3.4+

from pathlib import Path

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

выведет :

если путь может быть символическую ссылку, затем добавить resolve()

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

для полноты ради, вот pathlib решение для python 3.2+:

from pathlib import Path

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

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

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

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

например, изображения.смола.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

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

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

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


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

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

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

мой.доклад


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

import os

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

возвращает filename без extension(C:\Users\Public\Videos\Sample видео\дикая природа)

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

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

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

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

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

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

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

>>> print(os.path.splitext(os.path.basename(s))[0])
akarmi

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

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

мы могли бы сделать некоторые простые split / pop магия, как видно здесь (https://stackoverflow.com/a/424006/1250044), чтобы извлечь имя файла (с учетом различий 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

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


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

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

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

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