这很好用:
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 包含点,该方法将损坏它。
脚注:在 Micorsoft 操作系统之外,没有文件名“扩展名”之类的东西。它在 Windows 上的存在来自 MS-DOS 和 FAT,它从已经死了几十年的 CP/M 借来了它。我们许多人习惯看到的点加三个字母只是其他所有现代操作系统文件名的一部分,它没有内置含义。