Python pathlib.Path - 我如何获得一个独立于平台的文件分隔符作为字符串?

Python pathlib.Path - how do I get just a platform independent file separator as a string?

我正在创建一个与 class 不同的格式字符串,用于通过通用 class 方法生成文件名。我正在使用面向对象文件 Python 3.4+ pathlib.Path 模块 I/O.

在构建这个字符串时,缺少路径分隔符,我想添加一个独立于平台的文件分隔符,而不是只放入 windows 版本。

我搜索了 pathlib 文档,并在此处回答了这个问题,但所有示例都假设我正在构建 Path 对象,而不是字符串。 pathlib 函数将在任何字符串输出中添加正确的分隔符,但是 ose 是实际路径 - 所以它不会工作。

除了像写一个字符串并解析它来弄清楚分隔符是什么这样的 hacky 之外,有没有办法直接获取当前正确的文件分隔符字符串?

更喜欢使用 pathlib.Path 的答案,而不是 os 或 shutil 包。

代码如下所示:

在构造函数中:

    self.outputdir = Path('drive:\dir\file')
    self.indiv_fileformatstr = str(self.outputdir) + '{}_new.m'

最后使用的方法:

    indiv_filename = Path(self.indiv_fileformatstr.format(topic))

这省去了文件分隔符

pathlib module providing the character used by the operating system to separate pathname components. If you really need it, import os and use os.sep.

中没有任何内容public

但您可能一开始就不需要它 - 如果您转换为字符串以加入文件名,它就缺少了 pathlib 的要点。在典型用法中,分隔符字符串本身不用于连接路径组件,因为路径库会覆盖除法运算符 (__truediv__ and __rtruediv__) for this purpose. Similarly, it's not needed for splitting due to methods such as Path.parts.

而不是:

self.indiv_fileformatstr = str(self.outputdir) + '{}_new.m'

你通常会这样做:

self.indiv_fileformatpath = self.outputdir / '{}_new.m'
self.indiv_fileformatstr = str(self.indiv_fileformatpath)

独立于平台的分隔符在pathlib.os.sep

使用wim的回答解决

根据 wim 的回答,以下内容效果很好:

  1. 在 Path 对象中保存格式字符串
  2. 将来需要替换成模板文件名时,只需使用 str(path_object) 将字符串取回即可。
import pathlib

# Start with following, with self.outputdir as pathlib.Path object
outputdir = 'c:\myfolder'
file_template_path = outputdir / '{}_new.m'

# Then to make the final file object later (i.e. in a child class, etc.)
base_filename_string = 'myfile'
new_file = pathlib.Path(str(file_template).format(base_filename_string))

这将创建:

pathlib.Path("c:\myfolder\myfile_new.m")

正在使用 prefix/postfix/etc 创建模板。

如果需要应用其他变量,可以使用2级格式化来应用专门的prefixes/postfixes等,然后将最终模板存储在一个Path对象中,如上所示。

在创建 2 级格式时,使用双括号,而第一级格式化程序应该只创建一个括号,而不是尝试解释标记。即 {{basename}} 变成 {basename} 没有任何变量替换。

prefix = 'new_'
postfix = '_1'
ext = 'txt'
file_template_path = outputdir / f'{prefix}{{}}{postfix}.{ext}'

它成为具有以下字符串的路径对象:

$ file_template_path
pathlib.Path("c:\myfolder\new_{}_1.txt")