python - 在Python中获取具有预先指定扩展名的文件基名

标签 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 的方法是什么?

最佳答案

没有内置函数可以满足您的要求。 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'

关于python - 在Python中获取具有预先指定扩展名的文件基名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22473573/

相关文章:

php - 重用由 PHP 表单中的文件上传创建的临时文件

javascript - 检查变量是否包含数组中的任何字符

python - Pandas 数据框查询

c++ - 已部署的 win32 应用程序的相对路径问题

python - Django - Haystack 查询序列化

c - 简单路径查找代码中的段错误

html - 如何在 Angular2 中提供图像?

windows - Git pull 错误 : unable to create file (Invalid argument)

python - 'google.cloud.storage' 问题。模块没有属性 'Client'

python - "attach"类似于 R 的 python 模块?