【问题标题】:Python os.path.join() on a list列表中的 Python os.path.join()
【发布时间】:2013-01-27 10:12:17
【问题描述】:

我可以的

>>> os.path.join("c:/","home","foo","bar","some.txt")
'c:/home\\foo\\bar\\some.txt'

但是,当我这样做时

>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> os.path.join(s)
['c:/', 'home', 'foo', 'bar', 'some.txt']

我在这里错过了什么?

【问题讨论】:

    标签: python python-2.7 os.path


    【解决方案1】:

    问题是,os.path.join 不接受 list 作为参数,它必须是单独的参数。

    这就是*,'splat' 运算符发挥作用的地方...

    我可以的

    >>> s = "c:/,home,foo,bar,some.txt".split(",")
    >>> os.path.join(*s)
    'c:/home\\foo\\bar\\some.txt'
    

    【讨论】:

    • 更多关于 splat 的上下文:docs.python.org/2/tutorial/…
    • 请注意,我尝试使用它来删除完整路径的最后一部分。它导致error(在 Mac 中),因为它缺少/Users/... 处的第一个斜线。为了解决这个问题,我手动添加了前导斜杠,以防有人遇到同样的问题......
    【解决方案2】:

    假设 join 不是这样设计的(正如 ATOzTOA 指出的那样),并且它只需要两个参数,您仍然可以使用内置的 reduce

    >>> reduce(os.path.join,["c:/","home","foo","bar","some.txt"])
    'c:/home\\foo\\bar\\some.txt'
    

    类似的输出:

    >>> os.path.join(*["c:/","home","foo","bar","some.txt"])
    'c:/home\\foo\\bar\\some.txt' 
    

    仅出于完整性和教育原因(以及* 不起作用的其他情况)。

    Python 3 提示

    reduce 已移至 functools 模块。

    【讨论】:

    • 在 Python 3 中,reduce 被移至 functools 模块,以防其他人像我一样寻找它。
    • 谢谢你的提示,我会调整我的答案。
    • 遗憾的是,python 越来越远离函数式风格,而不是拥抱它并开放。将reduce 移至模块是一个声明。
    • 2.7也可以from functools import reduce
    【解决方案3】:

    我偶然发现了列表可能为空的情况。在这种情况下:

    os.path.join('', *the_list_with_path_components)
    

    注意第一个参数,它不会改变结果。

    【讨论】:

      【解决方案4】:

      这只是方法。你没有错过任何东西。 official documentation 表明您可以使用列表解包来提供多个路径:

      s = "c:/,home,foo,bar,some.txt".split(",")
      os.path.join(*s)
      

      注意*s 而不是os.path.join(*s) 中的s。使用星号将触发列表的解包,这意味着每个列表参数将作为单独的参数提供给函数。

      【讨论】:

      • 最好再次查看您的链接 ;-)
      • @Greg 在 SO 上更喜欢将相关部分复制到答案中,而不仅仅是粘贴链接,因此可能会被否决
      【解决方案5】:

      如果您想从函数式编程的角度考虑,这也可以被认为是一个简单的 map reduce 操作。

      import os
      folders = [("home",".vim"),("home","zathura")]
      [reduce(lambda x,y: os.path.join(x,y), each, "") for each in folders]
      

      reduce 在 Python 2.x 中内置。在 Python 3.x 中,它已移至 itertools 但是接受的答案更好。

      这已在下面回答,但如果您有需要加入的项目列表,请回答。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        • 2020-04-10
        • 1970-01-01
        • 2016-06-06
        相关资源
        最近更新 更多