bestsource

패키지 하위 디렉터리의 데이터 액세스

bestsource 2023. 7. 18. 21:50
반응형

패키지 하위 디렉터리의 데이터 액세스

나는 데이터 파일을 열어야 하는 모듈로 파이썬 패키지를 작성하고 있습니다../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__.pydata패키지로 사용할 수 있습니다.

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를 사용한 패키지 검색 및 리소스 액세스

당신은 당신의 전체 모듈의 이름이 필요합니다. 당신은 디렉토리 트리가 그 세부사항을 나열하지 않습니다. 이것은 저에게 효과가 있었습니다.

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

반응형