在python中构建完整路径文件名,

Dam*_*ian 159 python filenames join

我需要将文件路径名传递给模块,该模块创建报告文档为pdf,html等.如何从目录名,基本文件名和fileformat字符串构建文件路径名?

在通话时该目录可能存在也可能不存在

例如

dir_name='/home/me/dev/my_reports'
base_filename='daily_report'
format = 'pdf'
Run Code Online (Sandbox Code Playgroud)

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

手动连接片段似乎不是一个好方法.我试过os.path.join

join(dir_name,base_filename,format)
Run Code Online (Sandbox Code Playgroud)

但它给了

/home/me/dev/my_reports/daily_report/pdf
Run Code Online (Sandbox Code Playgroud)

ʇsә*_*ɹoɈ 251

这很好用:

os.path.join(dir_name, base_filename + "." + filename_suffix)
Run Code Online (Sandbox Code Playgroud)

请记住,os.path.join()仅存在因为不同的操作系统使用不同的路径分隔符.它平滑了这种差异,因此跨平台代码不必为每个操作系统的特殊情况混乱.没有必要为文件名"extensions"(参见脚注)执行此操作,因为它们始终在每个操作系统上使用点字符连接到名称的其余部分.

如果使用函数无论如何都会让你感觉更好(并且你不必要地使代码复杂化),你可以这样做:

os.path.join(dir_name, '.'.join((base_filename, filename_suffix)))
Run Code Online (Sandbox Code Playgroud)

如果您希望保持代码清洁,只需在后缀中包含点:

suffix = '.pdf'
os.path.join(dir_name, base_filename + suffix)
Run Code Online (Sandbox Code Playgroud)

脚注:非Micorsoft操作系统上没有文件名"扩展名".它在Windows上的存在来自MS-DOS和FAT,它从CP/M中借用它,已经死了几十年.我们许多人习惯看到的那些点加三字母只是每个其他现代操作系统上文件名的一部分,它没有内置意义.

  • 你提到OS分隔符可能不是`.`.为此,可以使用`os.extsep`. (6认同)
  • 您花了一些时间来解释"文件名"扩展"仅在一个主要操作系统上具有重要意义(它们只是非Windows系统上文件名的一部分),并且它们的分隔符始终是一个点".OP还表示他们最终看到/ pdf.所以你可以完成`os.path.join(dir_name,base_filename,os.extsep,extension)`.你的答案是完全正确的. (6认同)
  • 是的,你是对的,它只返回一个字符串,所以os.path.join(dir_name,''.join([base_filename,os.extsep,extension]))应该这样做.同样,它不会破坏你答案的正确性. (3认同)
  • 我没有提到这样的事情. (2认同)
  • @sjbx 你应该在文件名部分之间加上 `+`。`os.path.join()` 在参数之间添加特定于操作系统的路径分隔符(例如`/`)(因为@sәɹoɈ 正确地将它们包含在他/她的答案中。因此,您的代码片段的正确形式是:`os .path.join(dir_name, base_filename + os.extsep + 扩展名)` (2认同)

Eug*_*ash 31

如果您有幸运行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')
Run Code Online (Sandbox Code Playgroud)

  • 我发现 pathlib 比 os.path.join 优雅得多,相比之下,它看起来相当笨重。 (3认同)
  • @wontleave:如果文件名已经有后缀, [`with_suffix()`](https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.with_suffix) 将替换它而不是附加。你想要类似“Path(dirname, filename2 + suffix)”的东西 (3认同)

Mar*_*air 21

嗯,为什么不呢:

>>>> import os
>>>> os.path.join(dir_name, base_filename + "." + format)
'/home/me/dev/my_reports/daily_report.pdf'
Run Code Online (Sandbox Code Playgroud)

  • splitext 函数保留了 '.' 在扩展的前面。这可能是最干净的方法。如果您希望它在您的代码中“看起来”更干净,我建议您使用函数或 lambda 函数。 (2认同)