小能豆

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

py

我需要将文件路径名传递给模块。如何根据目录名、基本文件名和文件格式字符串构建文件路径?

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

例如:

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

阅读 15

收藏
2024-10-10

共1个答案

小能豆

这很好用:

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中的后缀约定兼容,该约定是在提出此问题几年后在 python 3.4 中引入的。不需要向后兼容的新代码可以执行以下操作:

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

Path()如果您只处理本地操作系统的路径,您可能会倾向于使用较短的路径PurePath()。考虑到原始问题背后的跨平台问题,我会质疑这种选择。

警告:不要将 pathlib用于此目的。如果该方法包含点,with_suffix()则将损坏。base_filename


脚注:除了 Microsoft 操作系统,没有文件名“扩展名”这样的东西。Windows 上的扩展名来自 MS-DOS 和 FAT,它们从 CP/M 借用了扩展名,而 CP/M 已经消亡了几十年。我们许多人习惯看到的那个“点加三个字母”只是其他所有现代操作系统上的文件名的一部分,没有内置含义。

2024-10-10