我需要将文件路径名传递给一个模块。如何从目录名、基本文件名和文件格式字符串构建文件路径?
该目录在调用时可能存在,也可能不存在。
例如:
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
这很好:
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包含点,该方法将损坏它。
脚注:在微软操作系统之外,没有文件名“扩展名”这样的东西。它在Windows上的存在来自MS-DOS和FAT,它们借鉴了已经死亡几十年的CP/M。我们许多人习惯看到的点加三个字母只是其他现代操作系统上文件名的一部分,在那里它没有内置的含义。