如何从Python中的路径获取不带扩展名的文件名?
"/path/to/some/file.txt" → "file"
如何从Python中的路径获取不带扩展名的文件名?
"/path/to/some/file.txt" → "file"
当前回答
import os
path = "a/b/c/abc.txt"
print os.path.splitext(os.path.basename(path))[0]
其他回答
使用Pathlib回答几个场景
使用Pathlib,当只有一个扩展名(或没有扩展名)时,获取文件名很简单,但处理多个扩展名的一般情况可能会很困难。
零或一扩展
from pathlib import Path
pth = Path('./thefile.tar')
fn = pth.stem
print(fn) # thefile
# Explanation:
# the `stem` attribute returns only the base filename, stripping
# any leading path if present, and strips the extension after
# the last `.`, if present.
# Further tests
eg_paths = ['thefile',
'thefile.tar',
'./thefile',
'./thefile.tar',
'../../thefile.tar',
'.././thefile.tar',
'rel/pa.th/to/thefile',
'/abs/path/to/thefile.tar']
for p in eg_paths:
print(Path(p).stem) # prints thefile every time
两个或更少的扩展
from pathlib import Path
pth = Path('./thefile.tar.gz')
fn = pth.with_suffix('').stem
print(fn) # thefile
# Explanation:
# Using the `.with_suffix('')` trick returns a Path object after
# stripping one extension, and then we can simply use `.stem`.
# Further tests
eg_paths += ['./thefile.tar.gz',
'/abs/pa.th/to/thefile.tar.gz']
for p in eg_paths:
print(Path(p).with_suffix('').stem) # prints thefile every time
任意数量的扩展名(0、1或更多)
from pathlib import Path
pth = Path('./thefile.tar.gz.bz.7zip')
fn = pth.name
if len(pth.suffixes) > 0:
s = pth.suffixes[0]
fn = fn.rsplit(s)[0]
# or, equivalently
fn = pth.name
for s in pth.suffixes:
fn = fn.rsplit(s)[0]
break
# or simply run the full loop
fn = pth.name
for _ in pth.suffixes:
fn = fn.rsplit('.')[0]
# In any case:
print(fn) # thefile
# Explanation
#
# pth.name -> 'thefile.tar.gz.bz.7zip'
# pth.suffixes -> ['.tar', '.gz', '.bz', '.7zip']
#
# If there may be more than two extensions, we can test for
# that case with an if statement, or simply attempt the loop
# and break after rsplitting on the first extension instance.
# Alternatively, we may even run the full loop and strip one
# extension with every pass.
# Further tests
eg_paths += ['./thefile.tar.gz.bz.7zip',
'/abs/pa.th/to/thefile.tar.gz.bz.7zip']
for p in eg_paths:
pth = Path(p)
fn = pth.name
for s in pth.suffixes:
fn = fn.rsplit(s)[0]
break
print(fn) # prints thefile every time
已知第一个扩展的特殊情况
例如,如果扩展名可以是.tar、.tar.gz、.tar/gz.bz等;您可以简单地rsplit已知的扩展并获取第一个元素:
pth = Path('foo/bar/baz.baz/thefile.tar.gz')
fn = pth.name.rsplit('.tar')[0]
print(fn) # thefile
在Python 3.4中使用来自pathlib的.stream+
from pathlib import Path
Path('/root/dir/sub/file.ext').stem
将返回
'file'
请注意,如果文件有多个扩展名,stem将只删除最后一个扩展名。例如,Path('file.tar.gz').stream将返回'file.tar'。
我们可以做一些简单的拆分/弹出魔术,如图所示(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测试。
https://docs.python.org/3/library/os.path.html
在python 3中,pathlib“pathlib模块提供高级路径对象。”所以
>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> p.with_suffix('')
WindowsPath('/a/b/c')
>>> p.stem
'c'