HOWTO · Python

在 Python 中获取文件扩展名

它演示了如何在 Python 中获取文件扩展名。

本页内容

在 Python 中获取文件名的扩展名时,若只需要最后一个后缀,可使用 os.path.splitext();若需要多个后缀部分(例如 .tar.bz2),可使用 pathlib.Path.suffixes。下面的示例说明两种结果的结构,方便你根据代码需要选择合适的形式。

在 Python 中使用 os.path 模块提取文件扩展名

os.path 提供了用于处理操作系统路径的实用函数。它的 splitext() 函数会返回一个包含两项的元组:根路径和最后一个扩展名。无论变量如何命名,都要按这个顺序接收元组中的两项。

运行下面的示例,路径以 .docx 结尾:

本节中的代码以及显示的标签或输出仍为英文。

import os

path = "/Users/user/Documents/sampledoc.docx"
root, extension = os.path.splitext(path)

print("Root:", root)
print("Extension:", extension)
Root: /Users/user/Documents/sampledoc
Extension: .docx

输出先显示根路径,再显示扩展名。splitext() 只处理最后一个后缀:对于 backup.tar.gz 这样的名称,它会分离出 .gz,并将 backup.tar 保留在根路径中。

splitext() 返回的扩展名包含开头的点号,因此可以方便地进行 extension == ".csv" 之类的比较。如果文件名没有后缀,扩展名部分就是空字符串,根路径则仍为文件名。单独位于开头的点号不算后缀,因此按照这条规则,.profile 这样的名称没有扩展名。

示例中的代码和输出标签保持英文原样;输出展示了根路径和扩展名的顺序。

在 Python 中使用 pathlib 模块提取文件扩展名

pathlib 使用对象表示路径。可以从路径字符串创建 Path,再查看它的属性:parent 表示所在路径,name 表示最后一个路径组成部分,suffix 表示包含开头点号的最后一个后缀。

对于 sampledoc.docx 这样的单后缀文件,path.suffix 的值是 .docx。这些属性是值,读取时不需要加括号。下面这个独立示例也展示了 suffix 和 suffixes 的区别:

本节中的代码以及显示的标签或输出仍为英文。

import pathlib

single = pathlib.Path("/Users/user/Documents/sampledoc.docx")
archive = pathlib.Path("/Users/user/Documents/app_sample.tar.bz2")

print("Parent:", single.parent)
print("Filename:", single.name)
print("Final suffix:", single.suffix)
print("Suffix parts:", single.suffixes)
print("Archive suffix:", "".join(archive.suffixes))
Parent: /Users/user/Documents
Filename: sampledoc.docx
Final suffix: .docx
Suffix parts: ['.docx']
Archive suffix: .tar.bz2

输出展示了所在路径、最后的文件名、最后一个后缀、后缀列表,以及拼接后的归档后缀。suffixes 是一个列表:对于 sampledoc.docx,列表只有一项 .docx;对于 app_sample.tar.bz2,列表包含 .tar 和 .bz2。用空字符串拼接这些部分会得到 .tar.bz2。当应用程序将复合后缀视为一个整体时,这种做法很有用;不过,许多文件名只有一个后缀。

路径没有后缀时,Path.suffix 是空字符串,Path.suffixes 是空列表。像 .profile 这样只有开头点号的名称不会被当作后缀。如果后续代码需要分别检查各个部分,就保留列表;只有当应用程序需要单个复合值时,才将它们拼接起来。这些属性描述的是路径最后一个名称组成部分,无论该路径当前是否指向一个实际存在的文件。

如果只需要最后一个后缀,或还需要在同一次操作中取得根路径,请选择 os.path.splitext()。如果使用面向对象的路径并需要单个后缀,请选择 Path.suffix;如果需要分别获取或拼接多个后缀部分,请选择 Path.suffixes。这两种方式都只检查名称,不会检查文件是否存在。