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

MHS*_*MHS 12 python regex

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

a = ['home/robert/Documents/Workspace/datafile.xlsx', 'home/robert/Documents/Workspace/datafile2.xls', 'home/robert/Documents/Workspace/datafile3.xlsx']
Run Code Online (Sandbox Code Playgroud)

我想要的是在没有扩展名的情况下获取NAMES文件,例如:

b = ['datafile', 'datafile2', 'datafile3']
Run Code Online (Sandbox Code Playgroud)

我试过的是:

xfn = re.compile(r'(\.xls)+')
for name in a:
    fp, fb = os.path.split(fp)
    ofn = xfn.sub('', name)
    b.append(ofn)
Run Code Online (Sandbox Code Playgroud)

但它导致:

b = ['datafilex', 'datafile2', 'datafile3x']
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 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'
    
    Run Code Online (Sandbox Code Playgroud)

    所以,假设您并不真正关心.xls/ .xlsxsuffix,您的代码可以像下面这样简单:

    >>> 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']
    
    Run Code Online (Sandbox Code Playgroud)

    (还要注意列表理解.)