Как получить имя файла без расширения из каталога в 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'
читаемая версия, используя
Pathlibв Python 3.4+from pathlib import Path Path('/root/dir/sub/file.ext').stemвыведет :
file
если путь может быть символическую ссылку, затем добавить
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
ОС.путь.splitext() не работа, если есть несколько точек в расширении.
например, изображения.смола.ГЗ
>>> 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
но даже когда я импортирую ОС, я не могу назвать его путь.базовое имя. Можно ли назвать его так же прямо, как basename?
import os, а затем использоватьos.path.basename
importingosне означает, что вы можете использоватьos.fooбез ссылки наos.
@IceAdor ссылается на rsplit в комментарии к решению @user2902201. rsplit это самое простое решение, которое поддерживает несколько периодов.
здесь изложены:
file = 'my.report.txt' print file.rsplit('.', 1)[0]мой.доклад
думал, что я бы бросил в вариации на использование ОС.путь.splitext без необходимости использовать индексацию массива.
функция всегда возвращает a
(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 osfilename = 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
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/'))это экономит ваше время и вычислительные затраты.
Comments