【问题标题】:File Path Concatenation文件路径连接
【发布时间】:2021-10-05 11:48:25
【问题描述】:

我需要结合作为参数传递给我的脚本的 UNC 路径、API 调用和计算日期来构建 Windows(仅限)文件路径。

我正在经历一段可怕的时光,主要是由于 Windows 使用反斜杠字符来分隔文件路径。我读过“pathlib”模块应该能够解决这个问题,但是在构建文件路径时它显然不支持连接。

UNC 路径作为字典从另一个应用程序(PRTG 网络监视器:

{"fileshare": "//server02/logs/"}

我读过它,然后需要附加一个从 API 调用派生的主机名:

logPath = Path(params["fileshare"] + "/" + apiHostname + "/")

然后我计算需要附加到日志路径的日期,以及分隔符“-”和文件名后缀:

filePath = Path(logPath, + apiHostname + "-", + past_day + ".log" )

连接时出现问题:

{"text": "Python Script execution error: unsupported operand type(s) for +: 'WindowsPath' and 'str'", "error": 1}}

谁能解释我如何构建一个路径,以便计算出的文件名应该如下所示:

\\server02\logs\log01.rhmgmt.lan\log01.rhmgmt.lan-2021-07-28.log

可以打开处理吗?

【问题讨论】:

  • Path(params["fileshare"] + "/" + apiHostname + "/") 看起来不对。您通常使用逗号分隔的参数调用这些函数,它会为您进行连接。通常我使用os.path.join(foo, bar, baz)logPath, + apiHostname 只是一个错字——在参数列表的中间有一个悬挂的+——删除它。
  • 你不能使用joinpath()方法来连接它们吗?
  • 如果您使用的是pathlib.Path,那么您应该使用它的功能——/ 运算符——来连接路径,而不是字符串连接。另请注意,在正常情况下,正斜杠在 Windows 路径中工作得很好cmd.exe 接受它们(它们只是弄乱了制表符完成等)并且 Python 程序接受它们。 C++ programs accept them, too, 好像是在windows端实现的。

标签: python windows path concatenation pathlib


【解决方案1】:

是的“pathlib”模块应该能够解决这个问题

输入:

from datetime import date, timedelta
from pathlib import Path

params = {"fileshare": "//server02/logs/"}
apiHostname = 'log01.rhmgmt.lan'
past_day = str((date.today() - timedelta(days=1)))

创建初始路径并附加所有部分:

fileshare = Path(params['fileshare'])
filepath = fileshare / apiHostname / f"{apiHostname}-{past_day}.log"

输出:

>>> filepath
PosixPath('//server02/logs/log01.rhmgmt.lan/log01.rhmgmt.lan-2021-07-28.log')

【讨论】:

    【解决方案2】:

    是的,pathlib 可以轻松解决问题。 您可以使用joinpath() 方法,正如我在评论中建议的那样,在您正在构建Path 时连接组件。它的作用与os.path.join() 的作用相同。

    唯一有点棘手的部分是您必须首先创建一个空的Path 才能使用它们从PurePath 继承的方法。

    from datetime import date, timedelta
    from pathlib import Path
    
    params = {"fileshare": "//server02/logs/"}
    apiHostname = 'log01.rhmgmt.lan'
    past_day = str((date.today() - timedelta(days=1)))
    
    filePath = Path().joinpath(params["fileshare"], apiHostname, 
                               apiHostname + '-' + past_day + '.log')
    print(filePath)  # -> \\server02\logs\log01.rhmgmt.lan\log01.rhmgmt.lan-2021-07-29.log
    
    

    【讨论】:

      猜你喜欢
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 2014-06-30
      • 2019-01-06
      • 1970-01-01
      相关资源
      最近更新 更多