我在这样的列表中有完整的文件路径:
a = ['home/robert/Documents/Workspace/datafile.xlsx', 'home/robert/Documents/Workspace/datafile2.xls', 'home/robert/Documents/Workspace/datafile3.xlsx']
我想要的只是获取没有扩展名的文件NAMES,例如:
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']
答案 0 :(得分:28)
你使用的正则表达式是错误的。 (\.xls)+
匹配.xls
,.xls.xls
等格式的字符串。这就是x
项中剩余.xlsx
的原因。你想要的是\.xls.*
,即一个.xls
后跟零个或多个任何字符。
你真的不需要使用正则表达式。 os.path中有一些处理此问题的专门方法:basename和splitext。
>>> import os.path
>>> os.path.basename('home/robert/Documents/Workspace/datafile.xlsx')
'datafile.xlsx'
>>> os.path.splitext(os.path.basename('home/robert/Documents/Workspace/datafile.xlsx'))[0]
'datafile'
所以,假设您并不真正关心.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']
(另请注意list comprehension。)
答案 1 :(得分:4)
Oneliner:
>>> filename = 'file.ext'
>>> '.'.join(filename.split('.')[:-1]) if '.' in filename else filename
'file'
答案 2 :(得分:0)
为什么不使用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'
答案 3 :(得分:0)
这是重复的: How to get the filename without the extension from a path in Python?
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