在 Python 中构建完整路径文件名

新手上路,请多包涵

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

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

例如:

 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

原文由 Damon Julian 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 523
2 个回答

这工作正常:

 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 借来了它。我们许多人习惯看到的点加三个字母只是每个其他现代操作系统上文件名的一部分,它没有内置含义。

原文由 ʇsәɹoɈ 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果你有幸运行 Python 3.4+,你可以使用 pathlib

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

原文由 Eugene Yarmash 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题