[PYTHON] 파이썬 패키지 내부에서 (정적 인) 파일을 읽는 방법?
PYTHON파이썬 패키지 내부에서 (정적 인) 파일을 읽는 방법?
파이썬 패키지 안에있는 파일을 어떻게 읽을 수 있습니까?
로드하는 패키지에는 프로그램 내에서로드하려는 여러 템플릿 (문자열로 사용되는 텍스트 파일)이 있습니다. 하지만 어떻게 그 파일에 대한 경로를 지정합니까?
내가 파일을 읽길 원한다고 가정 해보자.
package\templates\temp_file
어떤 종류의 경로 조작? 패키지 기본 경로 추적?
해결법
-
==============================
1.[2016-06-15 추가 : 분명히 이것은 모든 상황에서 작동하지 않습니다. 다른 답변을 참조하십시오]
[2016-06-15 추가 : 분명히 이것은 모든 상황에서 작동하지 않습니다. 다른 답변을 참조하십시오]
import os, mypackage template = os.path.join(mypackage.__path__[0], 'templates', 'temp_file')
-
==============================
2.템플릿이이 경로의 모듈 패키지 안에 있다고 가정합니다.
템플릿이이 경로의 모듈 패키지 안에 있다고 가정합니다.
<your_package>/templates/temp_file
템플릿을 읽는 올바른 방법은 setuptools 배포본의 pkg_resources 패키지를 사용하는 것입니다 :
import pkg_resources resource_package = __name__ # Could be any module/package name resource_path = '/'.join(('templates', 'temp_file')) # Do not use os.path.join() template = pkg_resources.resource_string(resource_package, resource_path) # or for a file-like stream: template = pkg_resources.resource_stream(resource_package, resource_path)
Setuptools / pkg_resources 문서에 따르면 os.path.join을 사용하지 마십시오.
-
==============================
3.이 구조가있는 경우에
이 구조가있는 경우에
lidtk ├── bin │ └── lidtk ├── lidtk │ ├── analysis │ │ ├── char_distribution.py │ │ └── create_cm.py │ ├── classifiers │ │ ├── char_dist_metric_train_test.py │ │ ├── char_features.py │ │ ├── cld2 │ │ │ ├── cld2_preds.txt │ │ │ └── cld2wili.py │ │ ├── get_cld2.py │ │ ├── text_cat │ │ │ ├── __init__.py │ │ │ ├── REAMDE.md <---------- say you want to get this │ │ │ └── textcat_ngram.py │ │ └── tfidf_features.py │ ├── data │ │ ├── __init__.py │ │ ├── create_ml_dataset.py │ │ ├── download_documents.py │ │ ├── language_utils.py │ │ ├── pickle_to_txt.py │ │ └── wili.py │ ├── __init__.py │ ├── get_predictions.py │ ├── languages.csv │ └── utils.py ├── README.md ├── setup.cfg └── setup.py
이 코드가 필요합니다 :
import pkg_resources # __name__ in case you're within the package # - otherwise it would be 'lidtk' in this example as it is the package name path = 'classifiers/text_cat/REAMDE.md' # always use slash filepath = pkg_resources.resource_filename(__name__, path)
나는 항상 "슬래시 사용"부분에 대해서는 확신하지 못합니다. 그것은 setuptools에서 올지도 모른다
문서가 어디에 있는지 궁금한 경우
-
==============================
4.패키지의 모든 파이썬 모듈에는 __file__ 속성이 있습니다.
패키지의 모든 파이썬 모듈에는 __file__ 속성이 있습니다.
다음과 같이 사용할 수 있습니다.
import os from mypackage templates_dir = os.path.join(os.path.dirname(mypackage.__file__), 'templates') template_file = os.path.join(templates_dir, 'template.txt')
계란 자원에 대해서는 http://peak.telecommunity.com/DevCenter/PythonEggs#accessing-package-resources를 참조하십시오.
-
==============================
5.David Beazley와 Brian K. Jones가 쓴 "Python Cookbook, Third Edition"의 "10.8. 패키지 내의 데이터 파일 읽기"의 내용은 해답을 제공합니다.
David Beazley와 Brian K. Jones가 쓴 "Python Cookbook, Third Edition"의 "10.8. 패키지 내의 데이터 파일 읽기"의 내용은 해답을 제공합니다.
나는 단지 여기에 그것을 얻을 것이다 :
다음과 같이 정리 된 파일이있는 패키지가 있다고 가정 해보십시오.
mypackage/ __init__.py somedata.dat spam.py
이제 spam.py 파일이 somedata.dat 파일의 내용을 읽길 원한다고 가정합니다. 할 것 다음 코드를 사용하십시오.
import pkgutil data = pkgutil.get_data(__package__, 'somedata.dat')
결과 변수 데이터는 파일의 원시 내용을 포함하는 바이트 문자열입니다.
get_data ()의 첫 번째 인수는 패키지 이름을 포함하는 문자열입니다. 너는 할 수있다. 직접 공급하거나 __package__과 같은 특수 변수를 사용하십시오. 두번째 인수는 패키지 내의 파일의 상대 이름입니다. 필요한 경우 탐색 할 수 있습니다. 표준 유닉스 파일 이름 규칙을 사용하는 다른 디렉토리로 최종 디렉토리는 여전히 패키지 내에 있습니다.
이 방법으로 패키지는 디렉토리, .zip 또는 .egg로 설치할 수 있습니다.
-
==============================
6.계란 파일을 사용하고 있다고 가정하십시오. 추출되지 않음 :
계란 파일을 사용하고 있다고 가정하십시오. 추출되지 않음 :
필자는 egginstall (zip 파일)에서 파일 시스템의 적절한 디렉토리로 템플릿을 추출하는 postinstall 스크립트를 사용하여 최근 프로젝트에서이 문제를 "해결"했습니다. __path __ [0]을 사용하여 작업 할 때가끔 잘못 될 수 있으므로 가장 빠르고 안정적인 해결책이었습니다 (이름을 기억하지 못했지만 적어도 하나의 라이브러리를 통해 그 목록 앞에 뭔가를 추가했습니다!). .
또한 계란 파일은 일반적으로 "계란 캐시"라는 임시 위치로 즉석에서 추출됩니다. 스크립트를 시작하기 전에 또는 나중에 환경 변수를 사용하여 해당 위치를 변경할 수 있습니다 (예 :).
os.environ['PYTHON_EGG_CACHE'] = path
그러나 작업을 제대로 수행 할 수있는 pkg_resources가 있습니다.
-
==============================
7.만나다
만나다
파이썬 모듈 배포판에서 파일 찾기
-
==============================
8.다음과 같이 패키지의 네임 스페이스 부분을 가져올 수 있어야합니다.
다음과 같이 패키지의 네임 스페이스 부분을 가져올 수 있어야합니다.
from my_package import my_stuff
... 제대로 구성된 Python 패키지 (보통 추상화되어있는 경우) 인 경우 파일 이름과 비슷한 것을 지정하지 않아도됩니다.
from https://stackoverflow.com/questions/6028000/how-to-read-a-static-file-from-inside-a-python-package by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] Python pandas to_excel 'utf8'코덱에서 바이트를 디코딩 할 수 없습니다. (0) | 2018.11.14 |
---|---|
[PYTHON] 판다를 사용하여 행당 다른 수의 열로 CSV 가져 오기 (0) | 2018.11.14 |
[PYTHON] 마샬링 덤프가 더 빨라지고 cPickle이 더 빨리로드됩니다. (0) | 2018.11.14 |
[PYTHON] Miniconda에 Jupyter Notebook을 설치하십시오. (0) | 2018.11.14 |
[PYTHON] Numpy 및 16 비트 PGM (0) | 2018.11.14 |