如何从各部分(如文件夹路径、名称和扩展名)创建文件的完整路径?

284 投票
7 回答
422752 浏览
提问于 2025-04-17 00:00

我需要把一个文件路径传给一个模块。请问我该如何根据目录名、基础文件名和文件格式字符串来构建这个文件路径呢?

这个目录在调用时可能存在,也可能不存在。

举个例子:

dir_name='/home/me/dev/my_reports'
base_filename='daily_report'
format = 'pdf'

我想创建一个字符串 '/home/me/dev/my_reports/daily_report.pdf'

手动把这些部分拼接起来似乎不是个好办法。我试过用 os.path.join

join(dir_name,base_filename,format)

但是它给出的结果是

/home/me/dev/my_reports/daily_report/pdf

7 个回答

34

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如,有人可能会在使用某个特定的功能时,发现它并没有按照预期工作。这种情况可能会让人感到困惑,不知道该如何解决。

通常,解决这类问题的第一步是仔细检查代码,看看有没有拼写错误或者逻辑上的问题。有时候,问题可能出在我们对某个功能的理解上,或者是我们没有正确使用它。

另外,查看相关的文档或者社区的讨论也是一个好办法。很多时候,其他人可能也遇到过类似的问题,他们的解决方案可能会给我们带来启发。

总之,遇到问题时,保持冷静,逐步排查,通常都能找到解决办法。

>>> import os
>>> os.path.join(dir_name, base_filename + "." + format)
'/home/me/dev/my_reports/daily_report.pdf'
74

在Python 3.4及以上版本中,可以使用pathlib这个标准库模块,使用方法如下:

>>> from pathlib import Path
>>> dirname, filename, suffix = '/home/reports', 'daily', '.pdf'
>>> Path(dirname, filename).with_suffix(suffix)
PosixPath('/home/reports/daily.pdf')
435

这个方法很好用:

os.path.join(dir_name, base_filename + '.' + filename_suffix)

要记住,os.path.join() 这个函数之所以存在,是因为不同的操作系统使用不同的路径分隔符。这个函数可以帮助我们处理这些差异,这样跨平台的代码就不用为每个操作系统写特别的处理了。对于文件名的“扩展名”(见脚注),就没有必要这样做,因为在所有实现了扩展名的操作系统中,它们总是以一个点(.)开头。

如果你觉得使用函数会让你更安心(而且你喜欢让代码变得复杂),你可以这样做:

os.path.join(dir_name, '.'.join((base_filename, filename_suffix)))

如果你想保持代码的简洁,可以直接在后缀中加上点:

suffix = '.pdf'
os.path.join(dir_name, base_filename + suffix)

这种方法也符合 pathlib 的后缀约定,pathlib 是在 Python 3.4 中引入的,那个时候这个问题已经被提出来好几年了。新的代码如果不需要向后兼容,可以这样做:

suffix = '.pdf'
pathlib.PurePath(dir_name, base_filename + suffix)

如果你只是处理本地操作系统的路径,可能会想用更短的 Path() 而不是 PurePath()。不过考虑到原问题的跨平台问题,我会对这个选择表示怀疑。

警告:不要为了这个目的使用 pathlib 的 with_suffix()。这个方法会在 base_filename 中如果包含点时导致数据损坏。


脚注:在微软的操作系统之外,并没有所谓的文件名“扩展名”。在 Windows 上出现扩展名是因为 MS-DOS 和 FAT 的影响,它们是从 CP/M 这里借来的,而 CP/M 已经消亡了几十年。我们习惯看到的那个点加三个字母,其实在其他现代操作系统中只是文件名的一部分,并没有内置的特殊含义。

撰写回答