使用斜杠将多个字符串连接到python中的路径

Ste*_*app 5 python

我尝试将以下字符串连接到路径

mr = "/mapr"
cn = "12.12.12"
lp = "/data/dir/"
vin = "var"
os.path.join(mr, cn, lp, vin)
Run Code Online (Sandbox Code Playgroud)

导致

'/data/dir/var'
Run Code Online (Sandbox Code Playgroud)

为了达到预期的结果,我需要删除变量lp中的第一个正斜杠

lp = "data/dir/"
os.path.join(mr, cn, lp, vin)

'/mapr/12.12.12/data/dir/var'
Run Code Online (Sandbox Code Playgroud)

有没有更优雅的做法,因为我不想在开始时解析转发斜杠的所有标识符?

Ara*_*Fey 2

这里的解决方案取决于上下文:您想为用户提供多少权力?您对他们输入合理内容的信任程度如何?你想要得到的结果是相对路径还是绝对路径?

  • 选项 1:将权力交给用户

    让用户做他们想做的事,并让他们自己负责做正确的事情:

    result = os.path.join(mr, cn, lp, vin)
    # result: '/data/dir/var'
    
    Run Code Online (Sandbox Code Playgroud)

    这为用户提供了最大程度的控制。

  • 选项 2:强制一切都是相对的

    如果您想强制每个单独的段成为相对路径,则无法剥离任何前导路径分隔符。

    seps = r'\/'  # backslash for windows, slash for all platforms
    fragments = [part.strip(seps) for part in [mr, cn, lp, vin]]
    result = os.path.join(*fragments)
    # result: 'mapr/12.12.12/data/dir/var'
    
    Run Code Online (Sandbox Code Playgroud)

    如果您需要结果是绝对路径,请将其与根目录连接:

    seps = r'\/'
    root = '/var/log'
    fragments = [part.strip(seps) for part in [mr, cn, lp, vin]]
    result = os.path.join(root, *fragments)
    # result: '/var/log/mapr/12.12.12/data/dir/var'
    
    Run Code Online (Sandbox Code Playgroud)