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

用斜杠将多个字符串连接到python中的路径,python,Python,我尝试将以下字符串连接到路径 mr = "/mapr" cn = "12.12.12" lp = "/data/dir/" vin = "var" os.path.join(mr, cn, lp, vin) 导致 '/data/dir/var' 为了得到期望的结果,我需要删除变量lp中的第一个正斜杠 lp = "data/dir/" os.path.join(mr, cn, lp, vin) '/mapr/12.12.12/data/dir/var' 因为我不想在开头解析一个前向斜杠的所

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

mr = "/mapr"
cn = "12.12.12"
lp = "/data/dir/"
vin = "var"
os.path.join(mr, cn, lp, vin)
导致

'/data/dir/var'
为了得到期望的结果,我需要删除变量lp中的第一个正斜杠

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

'/mapr/12.12.12/data/dir/var'

因为我不想在开头解析一个前向斜杠的所有标识符,有没有更优雅的方法呢?

不指定任何分隔符不是关于
os.path
的全部内容吗

这个怎么样

import os

mr = "mapr"
cn = "12.12.12"
lp = ["data","dir"]
vin = "var"

os.path.join(mr, cn, *lp, vin)

这里的解决方案取决于上下文:您希望给用户多少权力?你相信他们会做出多少明智的贡献?结果是要获得相对路径还是绝对路径

  • 选项1:给用户供电

    让用户做任何他们想做的事情,并让他们自己承担正确操作的责任:

    result = os.path.join(mr, cn, lp, vin)
    # result: '/data/dir/var'
    
    这为用户提供了最大程度的控制

  • 选项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'
    
    如果需要将结果作为绝对路径,请将其与根目录连接:

    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'
    

如果将现有数据连接起来,您将得到:
“/mapr12.12.12/data/dir/var”
。首先,为什么数据格式不正确(即绝对路径而不是相对路径)?这个问题可能应该在上游解决。我得到的数据部分是从配置文件中读取的,用户可能会错误地指定配置文件。当然可以清除所有读取的数据并删除第一个/但我正在寻找一个更优雅的solution@StefanPapp我不确定你认为什么是“优雅”在这里-如果输入数据是错误的,处理使它不那么错误通常会看起来有点“错”了。如果不允许某些路径为绝对路径,则始终可以
var.lstrip(os.path.sep)
。不过,如果输入错误,你可能会做得最好,或者至少会发出一些警告,这样输入错误就不会被默默地忽略。