패키지 하위 디렉터리의 데이터 액세스
나는 데이터 파일을 열어야 하는 모듈로 파이썬 패키지를 작성하고 있습니다../data/
하위 디렉터리.지금은 클래스와 기능에 하드 코딩된 파일의 경로를 가지고 있습니다.서브디렉토리가 사용자의 시스템 어디에 설치되어 있는지에 관계없이 접근할 수 있는 보다 강력한 코드를 작성하고 싶습니다.
여러 가지 방법을 시도해 보았지만, 지금까지 운이 없었습니다.대부분의 "current directory" 명령은 모듈의 디렉토리가 아닌 시스템의 python interpreter의 디렉토리를 반환하는 것 같습니다.
이것은 사소한, 일반적인 문제가 되어야 할 것처럼 보입니다.하지만 저는 그것을 이해할 수 없는 것 같습니다.문제의 일부는 내 데이터 파일이.py
파일, 그래서 나는 가져오기 기능 등을 사용할 수 없습니다.
좋은 의견이라도 있나?
현재 제 패키지 디렉토리는 다음과 같습니다.
/
__init__.py
module1.py
module2.py
data/
data.txt
에 액세스하려고 합니다.data.txt
부터module*.py
!
표준 방법은 setuptools 패키지 및 pkg_resources를 사용하는 것입니다.
다음 계층에 따라 패키지를 배치하고 이 링크에 따라 데이터 리소스를 지정하도록 패키지 설치 파일을 구성할 수 있습니다.
http://docs.python.org/distutils/setupscript.html#installing-package-data
그런 다음 다음 다음 링크에 따라 pkg_resources를 사용하여 해당 파일을 다시 찾고 사용할 수 있습니다.
http://peak.telecommunity.com/DevCenter/PkgResources#basic-resource-access
import pkg_resources
DATA_PATH = pkg_resources.resource_filename('<package name>', 'data/')
DB_FILE = pkg_resources.resource_filename('<package name>', 'data/sqlite.db')
코드가 그대로 작동하지 않는 세부 코드를 답변하는 것은 의미가 없는 경우가 많지만, 저는 이것이 예외라고 생각합니다.대체 예정인 Python 3.7 추가pkg_resources
이름에 슬래시가 없는 패키지 내의 파일에 액세스할 수 있습니다.
foo/
__init__.py
module1.py
module2.py
data/
data.txt
data2.txt
즉, 액세스할 수 있습니다.data2.txt
내부 포장foo
예를 들어
importlib.resources.open_binary('foo', 'data2.txt')
하지만 그것은 예외적으로 실패할 것입니다.
>>> importlib.resources.open_binary('foo', 'data/data.txt')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.7/importlib/resources.py", line 87, in open_binary
resource = _normalize_path(resource)
File "/usr/lib/python3.7/importlib/resources.py", line 61, in _normalize_path
raise ValueError('{!r} must be only a file name'.format(path))
ValueError: 'data/data2.txt' must be only a file name
배치를 제외하고는 수정할 수 없습니다.__init__.py
에data
패키지로 사용할 수 있습니다.
importlib.resources.open_binary('foo.data', 'data.txt')
이 동작의 이유는 "설계상의 문제"입니다. 하지만 디자인이 바뀔 수도 있습니다.
사용할 수 있습니다.__file__
패키지에 대한 경로를 얻으려면 다음과 같이 하십시오.
import os
this_dir, this_filename = os.path.split(__file__)
DATA_PATH = os.path.join(this_dir, "data", "data.txt")
print open(DATA_PATH).read()
현재 작동하는 솔루션을 제공합니다.이 API를 사용하여 모든 휠을 재창조하지 마십시오.
실제 파일 시스템 파일 이름이 필요합니다.압축된 에그가 캐시 디렉토리로 추출됩니다.
from pkg_resources import resource_filename, Requirement
path_to_vik_logo = resource_filename(Requirement.parse("enb.portals"), "enb/portals/reports/VIK_logo.png")
지정된 리소스에 대해 읽을 수 있는 파일과 같은 개체를 반환합니다. 실제 파일, 문자열일 수 있습니다.IO 또는 유사한 개체입니다.스트림은 리소스에 있는 바이트를 있는 그대로 읽는다는 의미에서 "이진 모드"에 있습니다.
from pkg_resources import resource_stream, Requirement
vik_logo_as_stream = resource_stream(Requirement.parse("enb.portals"), "enb/portals/reports/VIK_logo.png")
pkg_resources를 사용한 패키지 검색 및 리소스 액세스
- https://setuptools.readthedocs.io/en/latest/pkg_resources.html#resource-extraction
- https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access
당신은 당신의 전체 모듈의 이름이 필요합니다. 당신은 디렉토리 트리가 그 세부사항을 나열하지 않습니다. 이것은 저에게 효과가 있었습니다.
import pkg_resources
print(
pkg_resources.resource_filename(__name__, 'data/data.txt')
)
눈에 띄게 된 데이터 파일과 특히설도압데파이일과터름일기파다확않합일지인으,해야 합니다.data/
무슨 일이 있어도 거의 접두사를 붙입니다.사용할 수 있습니다.os.path.join('data', 'data.txt)
대체 디렉터리 구분 기호가 필요한 경우 일반적으로 하드 코딩된 유닉스 스타일 디렉터리 구분 기호와 호환성 문제가 없습니다.
제가 답을 찾아냈다고 생각합니다.
다음을 포함하는 모듈 data_path.py를 만듭니다.
data_path = os.path.join(os.path.dirname(__file__),'data')
그런 다음 모든 파일을 열어 봅니다.
open(os.path.join(data_path,'filename'), <param>)
언급URL : https://stackoverflow.com/questions/779495/access-data-in-package-subdirectory
'bestsource' 카테고리의 다른 글
전체 디렉터리 트리에 대한 줄 끝 부분 변환(Git) (0) | 2023.07.18 |
---|---|
대용량 .csv 파일 읽기 (0) | 2023.07.18 |
마지막 Git 커밋을 준비되지 않은 영역으로 이동(또는 "실행 취소") (0) | 2023.07.18 |
셸 명령을 직접 실행하는 대신 파이썬의 OS 모듈 방식을 사용하는 이유는 무엇입니까? (0) | 2023.07.18 |
get_user_model vs settings를 사용하는 Django.AUTH_USER_MODEL (0) | 2023.07.18 |