如何使用python从文件basename中删除扩展

时间:2013-04-06 10:01:32

标签: python regex

我在这样的列表中有完整的文件路径:

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

4 个答案:

答案 0 :(得分:28)

  1. 你使用的正则表达式是错误的。 (\.xls)+匹配.xls.xls.xls等格式的字符串。这就是x项中剩余.xlsx的原因。你想要的是\.xls.*,即一个.xls后跟零个或多个任何字符。

  2. 你真的不需要使用正则表达式。 os.path中有一些处理此问题的专门方法:basenamesplitext

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