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

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

技术背景

在Python编程中,经常需要从文件名中提取文件扩展名,以进行文件类型的判断和处理。Python提供了多种方法来实现这一功能,每种方法都有其适用场景和优缺点。

实现步骤

1. 使用os.path.splitext()

os.path.splitext()函数可以将文件路径拆分为一个包含两个值的元组:根路径和扩展名。

1
2
3
4
5
import os
# 解包元组
file_name, file_extension = os.path.splitext("/Users/Username/abc.txt")
print(file_name)
print(file_extension)

2. 使用pathlib模块

pathlib模块提供了面向对象的路径操作方式,可以方便地获取文件扩展名。

1
2
3
4
5
import pathlib
print(pathlib.Path('/foo/bar.txt').suffix) # 输出: .txt
print(pathlib.Path('/foo/bar.txt').stem) # 输出: bar
print(pathlib.Path("hello/foo.bar.tar.gz").suffixes) # 输出: ['.bar', '.tar', '.gz']
print(''.join(pathlib.Path("hello/foo.bar.tar.gz").suffixes)) # 输出: .bar.tar.gz

3. 使用字符串分割方法

可以使用字符串的split()方法来手动分割文件名以获取扩展名。

1
2
3
filename = "example.jpeg"
extension = filename.split(".")[-1]
print(extension) # 输出: jpeg

4. 使用正则表达式

使用正则表达式可以灵活地匹配文件名中的扩展名。

1
2
3
4
import re
file_suffix = ".*(\..*)"
result = re.search(file_suffix, "somefile.ext")
print(result.group(1)) # 输出: .ext

5. 使用rpartition()方法

rpartition()方法可以从字符串的右侧开始分割,获取扩展名。

1
2
3
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
print(extension) # 输出: ext

核心代码

完整示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import os
import pathlib
import re

# 使用os.path.splitext()
file_name, file_extension = os.path.splitext("/Users/Username/abc.txt")
print(f"os.path.splitext() - 文件名: {file_name}, 扩展名: {file_extension}")

# 使用pathlib模块
path = pathlib.Path('/foo/bar.txt')
print(f"pathlib - 文件名: {path.stem}, 扩展名: {path.suffix}")

# 使用字符串分割方法
filename = "example.jpeg"
extension = filename.split(".")[-1]
print(f"字符串分割 - 扩展名: {extension}")

# 使用正则表达式
file_suffix = ".*(\..*)"
result = re.search(file_suffix, "somefile.ext")
print(f"正则表达式 - 扩展名: {result.group(1)}")

# 使用rpartition()方法
string = "folder/to_path/filename.ext"
extension = string.rpartition(".")[-1]
print(f"rpartition() - 扩展名: {extension}")

最佳实践

  • 优先使用os.path.splitext():对于大多数情况,os.path.splitext()是最安全和可靠的方法,它能正确处理各种路径和文件名。
  • 处理多扩展名文件:对于具有多个扩展名的文件(如file.tar.gz),可以使用pathlib模块的suffixes属性来获取所有扩展名。
  • 去除扩展名前的点:如果只需要扩展名的文本部分,可以使用os.path.splitext(filename)[1][1:]去除点。

常见问题

1. 手动分割可能出错

手动使用split()方法分割文件名时,可能会在文件名没有扩展名或有特殊情况(如隐藏文件)时出现错误。

1
2
print("filename".split(".")[-1])  # 输出: filename,实际上没有扩展名
print(".bashrc".split(".")[-1]) # 输出: bashrc,但这不是扩展名

2. os.path.splitext()处理多扩展名问题

os.path.splitext()在处理多扩展名文件时,只会返回最后一个点后的扩展名。

1
2
fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz')
print(fileExtension) # 输出: .gz,而不是 .tar.gz

可以使用pathlib模块的suffixes属性来解决这个问题:

1
2
x = 'file/path/archive.tar.gz'
print(''.join(pathlib.Path(x).suffixes)) # 输出: .tar.gz

从文件名中提取文件扩展名
https://119291.xyz/posts/extracting-extension-from-filename/
作者
ww
发布于
2025年5月26日
许可协议