내가 할 수있는
>>> 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
모듈 로 이동되었습니다 .
reduce
하여 functools
모듈 로 이동 되었습니다.
reduce
모듈 로 이동 하는 것은 진술입니다.
from functools import reduce
목록이 비어있는 상황을 우연히 발견했습니다. 이 경우 :
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]
reduce
Python 2.x에 내장되어 있습니다. Python 3.x에서는 다음으로 이동되었습니다. itertools
그러나 대답이 더 낫습니다.
이것은 아래에 답변되었지만 가입해야 할 항목 목록이있는 경우 응답합니다.