如何使用python从文件basename中删除扩展名
我在如下列表中获得了文件的完整路径:如何使用python从文件basename中删除扩展名,python,regex,Python,Regex,我在如下列表中获得了文件的完整路径: a = ['home/robert/Documents/Workspace/datafile.xlsx', 'home/robert/Documents/Workspace/datafile2.xls', 'home/robert/Documents/Workspace/datafile3.xlsx'] 我想要的是只获取文件名,不带扩展名,如: b = ['datafile', 'datafile2', 'datafile3'] 我尝试的是: xfn =
a = ['home/robert/Documents/Workspace/datafile.xlsx', 'home/robert/Documents/Workspace/datafile2.xls', 'home/robert/Documents/Workspace/datafile3.xlsx']
我想要的是只获取文件名,不带扩展名,如:
b = ['datafile', 'datafile2', 'datafile3']
我尝试的是:
xfn = re.compile(r'(\.xls)+')
for name in a:
fp, fb = os.path.split(fp)
ofn = xfn.sub('', name)
b.append(ofn)
但结果是:
b = ['datafilex', 'datafile2', 'datafile3x']
(\.xls)+
匹配形式为.xls
、.xls.xls
等的字符串。这就是.xlsx
项中剩余x
的原因。您需要的是\.xls.
,即.xls
后跟零个或多个字符.xls
/.xlsx
后缀,那么您的代码可以非常简单:
>>> a = ['home/robert/Documents/Workspace/datafile.xlsx', 'home/robert/Documents/Workspace/datafile2.xls', 'home/robert/Documents/Workspace/datafile3.xlsx']
>>> [os.path.splitext(os.path.basename(fn))[0] for fn in a]
['datafile', 'datafile2', 'datafile3']
(另请注意。)>>> filename = 'file.ext'
>>> '.'.join(filename.split('.')[:-1]) if '.' in filename else filename
'file'
为什么不直接使用
split
方法呢
def get_filename(path):
""" Gets a filename (without extension) from a provided path """
filename = path.split('/')[-1].split('.')[0]
return filename
>>> path = '/home/robert/Documents/Workspace/datafile.xlsx'
>>> filename = get_filename(path)
>>> filename
'datafile'
这是重复的:
在python 3 pathlib中,“pathlib模块提供高级路径对象”
为此使用
str.replace()
。这是非常非常快的你必须使用正则表达式吗os.path.splitext
删除扩展名…+1,以纠正OP的错误方法,并为问题提供更好的解决方案get_filename('/path/to/some/file.tar.bz2')=='file'
-应该是file.tar
def get_filename(path):
""" Gets a filename (without extension) from a provided path """
filename = path.split('/')[-1].split('.')[0]
return filename
>>> path = '/home/robert/Documents/Workspace/datafile.xlsx'
>>> filename = get_filename(path)
>>> filename
'datafile'
>>> from pathlib import Path
>>> p = Path("/a/b/c.txt")
>>> print(p.with_suffix(''))
\a\b\c
>>> print(p.stem)
c