12

我在这样的列表中获得了文件的完整路径:

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

4 回答 4

27
  1. 您使用的正则表达式是错误的。匹配,等(\.xls)+形式的字符串。这就是项目中有剩余的原因。您想要的是,即 a后跟零个或多个任意字符。.xls.xls.xlsx.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']
    

    (另请注意列表理解。)

于 2013-04-06T10:06:55.070 回答
4

单线:

>>> filename = 'file.ext'
>>> '.'.join(filename.split('.')[:-1]) if '.' in filename else filename
'file'
于 2013-04-06T10:10:17.123 回答
1

这是重复的: 如何从 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
于 2018-07-23T09:25:02.313 回答
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'
于 2013-04-06T10:10:50.723 回答