在 Python 中从文件名提取扩展名

是否有从文件名中提取扩展名的功能?

答案

是。使用os.path.splitext (请参阅Python 2.X 文档Python 3.X 文档 ):

>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'

与大多数手动字符串拆分尝试不同, os.path.splitext/a/bc/d正确地视为不具有扩展名而不是扩展名.c/d ,并且将.bashrc视为不具有扩展名而不是具有 extension .bashrc

>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
import os.path
extension = os.path.splitext(filename)[1]

3.4 版的新功能。

import pathlib

print(pathlib.Path('yourPathGoesHere').suffix)

我很惊讶还没有人提到pathlibpathlib非常棒!

如果需要所有后缀(例如,如果有.tar.gz ),则.suffixes将返回它们的列表!

import os.path
extension = os.path.splitext(filename)[1][1:]

只获取扩展名的文本,不带点。

一种选择可能是与点分开:

>>> filename = "example.jpeg"
>>> filename.split(".")[-1]
'jpeg'

文件没有扩展名时没有错误:

>>> "filename".split(".")[-1]
'filename'

但您必须小心:

>>> "png".split(".")[-1]
'png'    # But file doesn't have an extension

值得在其中添加一个下标,这样您就不会怀疑自己的列表为什么未显示 JPG。

os.path.splitext(filename)[1][1:].strip().lower()

上面的任何解决方案都可以,但是在 linux 上,我发现扩展字符串的末尾有换行符,这将阻止匹配成功。将strip()方法添加到末尾。例如:

import os.path
extension = os.path.splitext(filename)[1][1:].strip()

使用 splitext 时,双扩展名的文件存在问题(例如file.tar.gzfile.tar.bz2等)。

>>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
>>> fileExtension 
'.gz'

但应为: .tar.gz

可能的解决方案在这里

虽然这是一个古老的话题,但是我想知道为什么在这种情况下没有人提及一个非常简单的 Python api,称为 rpartition:

要获取给定文件绝对路径的扩展名,只需键入:

filepath.rpartition('.')[-1]

例:

path = '/home/jersey/remote/data/test.csv'
print path.rpartition('.')[-1]

会给你:'csv'

惊讶的是尚未提及:

import os
fn = '/some/path/a.tar.gz'

basename = os.path.basename(fn)  # os independent
Out[] a.tar.gz

base = basename.split('.')[0]
Out[] a

ext = '.'.join(basename.split('.')[1:])   # <-- main part

# if you want a leading '.', and if no result `None`:
ext = '.' + ext if ext else None
Out[] .tar.gz

好处:

  • 我可以想到的任何东西都能按预期工作
  • 没有模块
  • 没有正则表达式
  • 跨平台
  • 易于扩展(例如,没有扩展引号,仅扩展的最后一部分)

作为功能:

def get_extension(filename):
    basename = os.path.basename(filename)  # os independent
    ext = '.'.join(basename.split('.')[1:])
    return '.' + ext if ext else None