在Python中使用预先指定的扩展名获取文件基名

时间:2014-03-18 08:07:37

标签: python path filenames

我有以下字符串:

/path1/path2/foo.bar.qux.txt

我想要做的是通过指定扩展名来提取基本名称。 如果我将扩展名定义为.bar.qux.txt,则基本名称为“foo”。 然后,如果扩展名为.qux.txt,则基数为:foo.bar

Perl具有以下功能:

use File::Basename;
my $longones = "/path1/path2/foo.bar.qux.txt";
my $base = basename($longones,"*.bar.qux.txt");
print "$base\n";

Python的方法是什么?

2 个答案:

答案 0 :(得分:3)

没有内置功能可以满足您的需求。 os.path.splitext不允许定义应视为扩展名的内容。事实上,perl函数的名称basename是错误的,因为* NIX basename 包含扩展名。

但是,您可以将os.path.basenamersplit结合使用:

>>> import os
>>> os.path.basename('/path1/path2/foo.bar.qux.txt').rsplit('.bar.qux.txt')[0]
'foo'
>>> os.path.basename('/path1/path2/foo.bar.qux.txt').rsplit('.qux.txt')[0]
'foo.bar'

请注意,如果文件名包含扩展名,则可能会得到错误的结果:

>>> os.path.basename('/path1/path2/foo.bar.qux.txt.foo.bar.qux.txt').rsplit('.qux.txt')[0]
'foo.bar'

但是,您始终可以指定maxsplit 1来仅拆分第一个扩展名:

>>> os.path.basename('/path1/path2/foo.bar.qux.txt.foo.bar.qux.txt').rsplit('.qux.txt', maxsplit=1)[0]
'foo.bar.qux.txt.foo.bar'

在python2中,您必须在位置上将第二个参数指定为rsplit(text, 1)

或者使用rpartition

>>> os.path.basename('/path1/path2/foo.bar.qux.txt.foo.bar.qux.txt').rpartition('.qux.txt')[0]
'foo.bar.qux.txt.foo.bar'

使用正则表达式的解决方案可能是:

import re

def basename_without_ext(path, ext):
    regex = re.compile('{}$'.format(re.escape(ext)))
    return regex.sub('', os.path.basename(path))

用作:

>>> basename_without_ext('/path1/path2/foo.bar.qux.txt.foo.bar.qux.txt', '.qux.txt')
'foo.bar.qux.txt.foo.bar'
>>> basename_without_ext('/path1/path2/foo.bar.qux.txt', '.bar.qux.txt')
'foo'

答案 1 :(得分:-1)

Python有os.path.basename,但它不允许您定义扩展名:

import os
os.path.basename(filename)

使用str.endswith()和切片似乎很容易。