如何使用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']
    
    (另请注意。)

  • Oneliner:

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