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__))
그러나 그것은 False
Windows 기계에 있습니다.
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
'code' 카테고리의 다른 글
ListViewItem은 ListView의 너비로 늘어나지 않습니다. (0) | 2020.10.09 |
---|---|
CouchDB에서 트랜잭션과 잠금을 할 수 있습니까? (0) | 2020.10.09 |
AFNetworking으로 시간 제한을 설정하는 방법 (0) | 2020.10.09 |
Laravel 유효성 검사 속성 "Nice names" (0) | 2020.10.09 |
Field Injection이란 정확히 무엇이며 어떻게 피할 수 있습니까? (0) | 2020.10.09 |