[python] 목록의 Python os.path.join ()

내가 할 수있는

>>> 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 용 힌트

reducefunctools모듈 로 이동되었습니다 .


답변

목록이 비어있는 상황을 우연히 발견했습니다. 이 경우 :

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

결과를 변경하지 않는 첫 번째 인수에 유의하십시오.


답변

방법 일뿐입니다. 당신은 아무것도 놓치고 있지 않습니다. 공식 문서의 여러 경로를 공급 풀고 목록을 사용할 수 있음을 보여줍니다 :

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

메모 *s단지의 intead s의를 os.path.join(*s). 별표를 사용하면 목록의 압축 해제가 트리거됩니다. 즉, 각 목록 인수가 별도의 인수로 함수에 제공됩니다.


답변

함수형 프로그래밍 관점에서 생각하고 싶다면 간단한 맵 축소 작업으로 생각할 수도 있습니다.

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

reducePython 2.x에 내장되어 있습니다. Python 3.x에서는 다음으로 이동되었습니다. itertools그러나 대답이 더 낫습니다.

이것은 아래에 답변되었지만 가입해야 할 항목 목록이있는 경우 응답합니다.


답변