2013-04-06 71 views
12
从文件名前缀扩展

我有文件的完整路径列表中是这样的:如何摆脱使用python

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

为此使用'str.replace()'。它很多,**很多**更快 – Amelia 2013-04-06 10:05:49

+2

你有没有使用正则表达式? 'os.path.splitext'删除扩展名... – Ben 2013-04-06 10:07:31

回答

28
  1. 你使用正则表达式是错误的。 (\.xls)+匹配表格.xls,.xls.xls等的字符串。这就是为什么.xlsx项目中有剩余x的原因。你想要的是\.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。)

+0

+1,用于纠正OP的错误方法并提供更好的解决方案 – dgraziotin 2013-04-06 10:16:35

4

Oneliner:

>>> filename = 'file.ext' 
>>> '.'.join(filename.split('.')[:-1]) if '.' in filename else filename 
'file' 
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' 
+1

'get_filename('/ path/to/some/file.tar.bz2') =='文件' - 应该是'file.tar' – 2013-04-06 12:19:37