복붙노트

[PYTHON] 파이썬 패키지 내부에서 (정적 인) 파일을 읽는 방법?

PYTHON

파이썬 패키지 내부에서 (정적 인) 파일을 읽는 방법?

파이썬 패키지 안에있는 파일을 어떻게 읽을 수 있습니까?

로드하는 패키지에는 프로그램 내에서로드하려는 여러 템플릿 (문자열로 사용되는 텍스트 파일)이 있습니다. 하지만 어떻게 그 파일에 대한 경로를 지정합니까?

내가 파일을 읽길 원한다고 가정 해보자.

package\templates\temp_file

어떤 종류의 경로 조작? 패키지 기본 경로 추적?

해결법

  1. ==============================

    1.[2016-06-15 추가 : 분명히 이것은 모든 상황에서 작동하지 않습니다. 다른 답변을 참조하십시오]

    [2016-06-15 추가 : 분명히 이것은 모든 상황에서 작동하지 않습니다. 다른 답변을 참조하십시오]

    
    import os, mypackage
    template = os.path.join(mypackage.__path__[0], 'templates', 'temp_file')
    
  2. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    6.계란 파일을 사용하고 있다고 가정하십시오. 추출되지 않음 :

    계란 파일을 사용하고 있다고 가정하십시오. 추출되지 않음 :

    필자는 egginstall (zip 파일)에서 파일 시스템의 적절한 디렉토리로 템플릿을 추출하는 postinstall 스크립트를 사용하여 최근 프로젝트에서이 문제를 "해결"했습니다. __path __ [0]을 사용하여 작업 할 때가끔 잘못 될 수 있으므로 가장 빠르고 안정적인 해결책이었습니다 (이름을 기억하지 못했지만 적어도 하나의 라이브러리를 통해 그 목록 앞에 뭔가를 추가했습니다!). .

    또한 계란 파일은 일반적으로 "계란 캐시"라는 임시 위치로 즉석에서 추출됩니다. 스크립트를 시작하기 전에 또는 나중에 환경 변수를 사용하여 해당 위치를 변경할 수 있습니다 (예 :).

    os.environ['PYTHON_EGG_CACHE'] = path
    

    그러나 작업을 제대로 수행 할 수있는 pkg_resources가 있습니다.

  7. ==============================

    7.만나다

    만나다

    파이썬 모듈 배포판에서 파일 찾기

  8. ==============================

    8.다음과 같이 패키지의 네임 스페이스 부분을 가져올 수 있어야합니다.

    다음과 같이 패키지의 네임 스페이스 부분을 가져올 수 있어야합니다.

    from my_package import my_stuff
    

    ... 제대로 구성된 Python 패키지 (보통 추상화되어있는 경우) 인 경우 파일 이름과 비슷한 것을 지정하지 않아도됩니다.

  9. from https://stackoverflow.com/questions/6028000/how-to-read-a-static-file-from-inside-a-python-package by cc-by-sa and MIT license