code

Windows의 Python os.path.join

codestyles 2020. 10. 9. 11:13
반응형

Windows의 Python os.path.join


나는 파이썬을 배우려고 노력하고 있으며 스크립트를 출력하는 프로그램을 만들고 있습니다. os.path.join을 사용하고 싶지만 꽤 혼란 스럽습니다. 내가 말하는 경우 문서 에 따르면 :

os.path.join('c:', 'sourcedir')

나는 "C:sourcedir". 문서에 따르면 이것은 정상입니다.

그러나 copytree 명령을 사용하면 Python이 원하는 방식으로 출력합니다. 예 :

import shutil
src = os.path.join('c:', 'src')
dst = os.path.join('c:', 'dst')
shutil.copytree(src, dst)

내가 얻는 오류 코드는 다음과 같습니다.

WindowsError : [Error 3] 지정한 경로를 찾을 수 없습니다 : 'C : src /*.*'

os.path.join와 함께 포장하면 os.path.normpath동일한 오류가 발생합니다.

os.path.join이런 식으로 사용할 수 없다면 그 목적이 혼란 스럽습니다.

Stack Overflow에서 제안한 페이지에 따르면 조인에 슬래시를 사용해서는 안됩니다. 맞습니다.


Windows에는 각 드라이브에 대한 현재 디렉토리 개념이 있습니다. 따라서 "c:sourcedir"현재 C : 디렉토리 내부의 "sourcedir"을 의미하며 절대 디렉토리를 지정해야합니다.

이들 중 어느 것이 든 작동하고 동일한 결과를 제공해야하지만, 현재 다시 확인하기 위해 Windows VM을 실행하지 않았습니다.

"c:/sourcedir"
os.path.join("/", "c:", "sourcedir")
os.path.join("c:/", "sourcedir")

더 현명하게 말하면 가장 파이썬 문서 일관된 대답은 다음과 같습니다.

mypath = os.path.join('c:', os.sep, 'sourcedir')

posix 루트 경로에 os.sep도 필요하기 때문에 :

mypath = os.path.join(os.sep, 'usr', 'lib')

그 이유 os.path.join('C:', 'src')는 다음과 같이 링크 한 문서의 내용 때문에 예상대로 작동하지 않습니다.

Windows에서는 각 드라이브에 대한 현재 디렉토리가 있으므로 os.path.join ( "c :", "foo")는 c가 아닌 C : (c : foo) 드라이브의 현재 디렉토리에 상대적인 경로를 나타냅니다. : \ foo.

ghostdog가 말했듯이, 당신은 아마도 mypath=os.path.join('c:\\', 'sourcedir')


현명하게 말하면 경로 구분자로 / 또는 \를 하드 코딩하는 것은 좋지 않을 것입니다. 아마도 이것이 최선일까요?

mypath = os.path.join('c:%s' % os.sep, 'sourcedir')

또는

mypath = os.path.join('c:' + os.sep, 'sourcedir')

Windows와 Linux 모두에서 작동하는 시스템에 구애받지 않는 솔루션의 경우 입력 경로에 관계없이 다음을 사용할 수 있습니다. os.path.join(os.sep, rootdir + os.sep, targetdir)

WIndows :

>>> os.path.join(os.sep, "C:" + os.sep, "Windows")
'C:\\Windows'

Linux의 경우 :

>>> os.path.join(os.sep, "usr" + os.sep, "lib")
'/usr/lib'

나는 이것이 (windows) python 버그라고 말하고 싶습니다.

왜 버그인가?

이 진술은 True

os.path.join(*os.path.dirname(os.path.abspath(__file__)).split(os.path.sep))==os.path.dirname(os.path.abspath(__file__))

그러나 그것은 FalseWindows 기계에 있습니다.


Windows 경로에 가입하려면

mypath=os.path.join('c:\\', 'sourcedir')

기본적으로 슬래시를 이스케이프해야합니다.


가장 하드 코딩 된 것 (원시 문자열 리터럴 사용 또는 이스케이프 백 슬래시 사용)부터 최소한의 경로까지 Windows에서 경로를 처리하는 몇 가지 가능한 접근 방식이 있습니다. 다음은 예상대로 작동하는 몇 가지 예입니다. 필요에 더 잘 맞는 것을 사용하십시오.

In[1]: from os.path import join, isdir

In[2]: from os import sep

In[3]: isdir(join("c:", "\\", "Users"))
Out[3]: True

In[4]: isdir(join("c:", "/", "Users"))
Out[4]: True

In[5]: isdir(join("c:", sep, "Users"))
Out[5]: True

@georg와의 동의

우리가 절름발이가 필요한 이유 나는 그 말을 os.path.join사용하는 것이 좋습니다를 - str.join또는 unicode.join예를

sys.path.append('{0}'.join(os.path.dirname(__file__).split(os.path.sep)[0:-1]).format(os.path.sep))

참고URL : https://stackoverflow.com/questions/2422798/python-os-path-join-on-windows

반응형