[PYTHON] 파이썬에서 코드 저장소로 작업 할 때 상대 경로를 참조하는 방법
PYTHON파이썬에서 코드 저장소로 작업 할 때 상대 경로를 참조하는 방법
우리는 Windows와 Linux 모두에 배포되는 코드 저장소 (때로는 서로 다른 디렉토리에 있음)로 작업하고 있습니다. 프로젝트 내부의 모듈 중 하나가 프로젝트의 비 파이썬 리소스 (CSV 파일 등) 중 하나를 참조해야합니까?
우리가 다음과 같이하면 :
thefile=open('test.csv')
또는:
thefile=open('../somedirectory/test.csv')
스크립트가 특정 디렉토리 또는 디렉토리의 서브 세트에서 실행될 때만 작동합니다.
제가하고 싶은 것은 다음과 같습니다 :
path=getBasePathOfProject()+'/somedirectory/test.csv'
thefile=open(path)
이것이 올바른 방법일까요? 가능한가?
해결법
-
==============================
1.현재 파일 경로를 기준으로 파일 이름을 사용하십시오. './my_file'의 예 :
현재 파일 경로를 기준으로 파일 이름을 사용하십시오. './my_file'의 예 :
fn = os.path.join(os.path.dirname(__file__), 'my_file')
-
==============================
2.설정 도구를 사용하거나 배포 (setup.py 설치)하는 경우 이러한 패키지 된 자원에 액세스하는 "올바른"방법은 package_resources를 사용하는 것 같습니다.
설정 도구를 사용하거나 배포 (setup.py 설치)하는 경우 이러한 패키지 된 자원에 액세스하는 "올바른"방법은 package_resources를 사용하는 것 같습니다.
귀하의 경우에는 그 예가 될 것입니다.
import pkg_resources my_data = pkg_resources.resource_string(__name__, "foo.dat")
리소스와 읽기 바이너리 데이터를 읽는 것은 my_data의 값입니다.
파일 이름 만 있으면 필요할 때 사용할 수 있습니다.
resource_filename(package_or_requirement, resource_name)
예:
resource_filename("MyPackage","foo.dat")
이점은 계란과 같은 아카이브 배포 물인 경우에도 작동하도록 보장된다는 것입니다.
http://packages.python.org/distribute/pkg_resources.html#resourcemanager-api를 참조하십시오.
-
==============================
3.나는 종종 이와 비슷한 것을 사용한다 :
나는 종종 이와 비슷한 것을 사용한다 :
import os DATA_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), 'datadir')) # if you have more paths to set, you might want to shorten this as here = lambda x: os.path.abspath(os.path.join(os.path.dirname(__file__), x)) DATA_DIR = here('datadir') pathjoin = os.path.join # ... # later in script for fn in os.listdir(DATA_DIR): f = open(pathjoin(DATA_DIR, fn)) # ...
변수
__file__
해당 코드를 작성하는 스크립트의 파일 이름을 보유하므로 스크립트에 상대적인 경로를 만들 수 있지만 절대 경로로 작성됩니다. 다음과 같은 이유로 잘 작동합니다.
그러나 플랫폼 호환성을 고려해야합니다. Windows의 os.pathsep는 UNIX와 다릅니다.
-
==============================
4.
import os cwd = os.getcwd() path = os.path.join(cwd, "my_file") f = open(path)
또한 os.path.abspath (os.getcwd ())를 사용하여 cwd를 정규화하려고 시도합니다. 더 많은 정보는 여기에 있습니다.
-
==============================
5.파이썬에서 경로는 현재 작업 디렉토리에 상대적입니다. 대부분의 경우이 경로는 프로그램을 실행하는 디렉토리입니다. 현재 작업 디렉토리는 모듈 파일의 디렉토리와 같지 않을 수 있으므로 현재 모듈 파일과 관련된 경로를 사용하면 항상 잘못된 선택입니다.
파이썬에서 경로는 현재 작업 디렉토리에 상대적입니다. 대부분의 경우이 경로는 프로그램을 실행하는 디렉토리입니다. 현재 작업 디렉토리는 모듈 파일의 디렉토리와 같지 않을 수 있으므로 현재 모듈 파일과 관련된 경로를 사용하면 항상 잘못된 선택입니다.
절대 경로를 사용하는 것이 가장 좋은 해결책입니다.
import os package_dir = os.path.dirname(os.path.abspath(__file__)) thefile = os.path.join(package_dir,'test.cvs')
-
==============================
6.__file__ 변수에서 빌드를 사용할 수 있습니다. 현재 파일의 경로를 포함합니다. 나는 프로젝트의 루트에있는 모듈에 getBaseOfProject를 구현할 것이다. 거기서 나는 __file__의 경로 부분을 얻을 것이고 그것을 반환 할 것입니다. 이 방법은 프로젝트의 모든 곳에서 사용할 수 있습니다.
__file__ 변수에서 빌드를 사용할 수 있습니다. 현재 파일의 경로를 포함합니다. 나는 프로젝트의 루트에있는 모듈에 getBaseOfProject를 구현할 것이다. 거기서 나는 __file__의 경로 부분을 얻을 것이고 그것을 반환 할 것입니다. 이 방법은 프로젝트의 모든 곳에서 사용할 수 있습니다.
-
==============================
7.나는이 문제에 대한 해답을 알아 내는데 오랜 시간을 보냈지 만 마침내 얻었습니다 (실제로는 실제로 간단합니다).
나는이 문제에 대한 해답을 알아 내는데 오랜 시간을 보냈지 만 마침내 얻었습니다 (실제로는 실제로 간단합니다).
import sys import os sys.path.append(os.getcwd() + '/your/subfolder/of/choice') # now import whatever other modules you want, both the standard ones, # as the ones supplied in your subfolders
이렇게하면 파이썬이 볼 수있는 디렉토리에 하위 폴더의 상대 경로가 추가됩니다. 그것은 꽤 빠르며 더럽지 만 매력처럼 작동합니다 :)
from https://stackoverflow.com/questions/1270951/how-to-refer-to-relative-paths-of-resources-when-working-with-a-code-repository by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬 클래스를 동적으로로드하는 방법 (0) | 2018.10.17 |
---|---|
[PYTHON] Pandas 데이터 프레임에서 특이점 검색 및 제외 (0) | 2018.10.17 |
[PYTHON] 파이썬 : NumPy 배열 정당화하기 (0) | 2018.10.17 |
[PYTHON] PyCharm에게 매개 변수의 유형을 알려주려면 어떻게해야합니까? (0) | 2018.10.17 |
[PYTHON] CPython에서 전역 인터프리터 잠금 (GIL)이란 무엇입니까? (0) | 2018.10.17 |