簡體   English   中英

列表中的 Python os.path.join()

[英]Python os.path.join() on a list

我可以

>>> 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']

我在這里缺少什么?

問題是, os.path.join不將list作為參數,它必須是單獨的參數。

這就是* ,'splat' 運算符發揮作用的地方......

我可以

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

假設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模塊。

我偶然發現了列表可能為空的情況。 在這種情況下:

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

注意第一個參數,它不會改變結果。

這只是方法。 你沒有錯過任何東西。 官方文檔顯示可以使用list unpacking來提供幾個路徑:

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

*s這一翻譯的只是sos.path.join(*s) 使用星號將觸發列表的解包,這意味着每個列表參數將作為單獨的參數提供給函數。

如果您想從函數式編程的角度考慮,這也可以被認為是一個簡單的 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但是公認的答案更好。

這已在下面回答,但如果您有需要加入的項目列表,請回答。

如果您在python 3中執行此操作,則會收到錯誤消息:

>>> s = "c:/,home,foo,bar,some.txt".split(",")
>>> s
['c:/', 'home', 'foo', 'bar', 'some.txt']
>>> os.path.join(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/wangjunyu/.pyenv/versions/3.7.0/lib/python3.7/posixpath.py", line 80, in join
    a = os.fspath(a)
TypeError: expected str, bytes or os.PathLike object, not list

在python 2中,什么也沒發生。 os.path.join(s)結果與print(s)相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM