Python中如何从路径中获取不带扩展名的文件名

Python中如何从路径中获取不带扩展名的文件名

技术背景

在Python编程中,经常会遇到需要处理文件路径的情况,其中一个常见需求是从文件路径中提取不带扩展名的文件名。例如,在文件批量处理、文件重命名等操作中,获取文件名的纯净部分是很有必要的。Python提供了多种方法来实现这一功能,下面将详细介绍不同版本Python下的实现方式。

实现步骤

Python 3.4+

在Python 3.4及以上版本中,推荐使用pathlib模块,它提供了面向对象的路径操作方式,使用Path.stem属性可以方便地获取不带扩展名的文件名。

1
2
3
4
5
6
from pathlib import Path

# 示例路径
path = "/path/to/file.txt"
filename_without_extension = Path(path).stem
print(filename_without_extension)

如果文件有多个扩展名,stem属性只会移除最后一个扩展名,例如:

1
2
3
path = "/path/to/file.tar.gz"
filename_without_extension = Path(path).stem
print(filename_without_extension) # 输出: file.tar

Python < 3.4

在Python 3.4之前的版本,可以使用os.path模块,结合os.path.splitextos.path.basename函数来实现。

1
2
3
4
5
6
import os

path = "/path/to/file.txt"
filename = os.path.basename(path)
filename_without_extension = os.path.splitext(filename)[0]
print(filename_without_extension)

同样,对于有多个扩展名的文件,splitext函数会在最后一个点处分割,例如:

1
2
3
4
path = "/path/to/file.tar.gz"
filename = os.path.basename(path)
filename_without_extension = os.path.splitext(filename)[0]
print(filename_without_extension) # 输出: file.tar

核心代码

处理任意数量扩展名的情况

如果需要处理任意数量的扩展名,可以使用以下代码:

1
2
3
4
5
6
7
8
9
10
11
from pathlib import Path

def get_filename_without_all_extensions(path):
pth = Path(path)
fn = pth.name
for s in pth.suffixes:
fn = fn.rsplit(s)[0]
return fn

path = "/path/to/file.tar.gz.bz.7zip"
print(get_filename_without_all_extensions(path)) # 输出: file

自定义函数实现

也可以自定义一个函数,使用os.path模块来处理,该函数可以处理文件名中包含多个点的情况:

1
2
3
4
5
6
7
8
9
10
import os

def get_filename_without_extension(file_path):
file_basename = os.path.basename(file_path)
index_of_dot = file_basename.index('.') if '.' in file_basename else len(file_basename)
filename_without_extension = file_basename[:index_of_dot]
return filename_without_extension

path = "/path/to/file.ext.tar.gz"
print(get_filename_without_extension(path)) # 输出: file

最佳实践

  • 使用pathlib模块:在Python 3.4及以上版本,优先使用pathlib模块,它提供了更简洁、面向对象的路径操作方式,代码可读性更高。
  • 考虑多种扩展名情况:如果处理的文件可能有多个扩展名,要确保代码能够正确处理这种情况,例如使用循环移除所有扩展名。
  • 异常处理:在使用index方法查找点的位置时,要考虑文件没有扩展名的情况,避免抛出ValueError异常,可以使用find方法并检查返回值是否为 -1。

常见问题

多个扩展名处理问题

使用os.path.splitextPath.stem时,默认只移除最后一个扩展名。如果需要移除所有扩展名,可以使用上述提到的循环方法。

文件名中包含点的问题

有些文件名本身可能包含点,例如my.file.txt,在处理时要确保逻辑正确。可以使用rsplit方法,指定最大分割次数为 1,从字符串末尾开始分割。

性能问题

在处理大量文件时,性能可能是一个考虑因素。可以使用timeit模块测试不同方法的性能,选择性能最优的方法。例如,使用str.rsplit方法可能比pathlib模块的方法性能更高:

1
2
3
4
5
6
7
8
9
10
11
12
13
import timeit

file = 'D:/ffmpeg/ffmpeg.exe'

def using_pathlib():
from pathlib import Path
return Path(file).stem

def using_rsplit():
return file.split('/')[-1].rsplit('.', 1)[0]

print(timeit.timeit(using_pathlib, number=100000))
print(timeit.timeit(using_rsplit, number=100000))

通过以上方法,你可以在Python中灵活地从文件路径中获取不带扩展名的文件名。


Python中如何从路径中获取不带扩展名的文件名
https://119291.xyz/posts/2025-04-18.python-get-filename-without-extension/
作者
ww
发布于
2025年4月18日
许可协议