목록의 Python os.path.join ()


97

내가 할 수있는

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

내가 여기서 무엇을 놓치고 있습니까?

답변:


198

문제는 인수 os.path.join가 아니라 list별도의 인수 여야한다는 것입니다.

여기서 *'splat'연산자가 작동합니다 ...

내가 할 수있는

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

10
플랫에 대한 좀 더 상황 : docs.python.org/2/tutorial/...
A.Wan

3
전체 경로의 마지막 부분을 제거하기 위해 이것을 사용하려고했습니다. 그것은 결과 오류 가 처음에 슬래시가 누락되었을 때, (맥에서) /Users/.... 이 문제를 해결하기 위해 누군가 동일한 문제에 직면 할 경우를 대비하여 선행 슬래시를 수동으로 추가했습니다.
J0ANMM

23

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모듈 로 이동되었습니다 .


2
파이썬 3에서는 다른 사람이 나처럼 그것을 찾는 경우를 대비 reduce하여 functools모듈 로 이동 되었습니다.
Adam Badura

힌트를 주셔서 감사합니다. 대답을 조정하겠습니다.
토르스텐 크란츠

3
파이썬이 그것을 포용하고 개방하는 대신 기능적 스타일에서 점점 더 멀어지는 것을 유감스럽게 생각합니다. reduce모듈 로 이동 하는 것은 진술입니다.
SHernandez

2.7에서도 캔from functools import reduce
duhaime

14

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

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

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


9

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

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

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


;-) 번 당신의 연결에 더 나은 모습
토르스텐 크란츠

@Greg는 링크를 붙여 넣는 것이 아니라 관련 부분을 답에 복사하는 것이
좋습니다.

2

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

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그러나 대답이 더 낫습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.