2017-12-13 5 views
1

anaconda condaパッケージフレームワークを使用してpython 3.6パッケージをビルドしています。 パッケージはソースファイルに関して正常に動作しているようです。 などのビルドエラーはありません。しかし、私はパッケージにいくつかの小さなCSVデータファイルを格納する新しい機能を追加しようとしています。 pandasAnacondaパッケージの問題:内部モジュールが同じディレクトリにあるデータファイルを見つけることができません

私が遭遇している問題は、相対的な ファイルパスをパッケージ内から正しく参照できないように見えることです。だから、もし私がパッケージに入っているとJupyterというノートで と言うとうまくいきましょう。 パスの問題は、問題自体が表示される方法のようですが、内部アドレス指定がパッケージ内でどのように処理されるかは、 とさらに関連していると思われます。

エラーメッセージは次のとおりです。

FileNotFoundError: File b'data.csv' does not exist 

このエラーについての奇妙なことはdata.csvファイルがアクセスしようとしているのpythonファイルと同じディレクトリにあるということです。だから私は以下のpythonモジュールreader.pyがこのファイルを見つけることができないように見えないのです。

したがって、パッケージの構造とコードの最小限の例を挙げておきます。

/project 
    /docs 
    /packaging 
     /conda_build_files 
      bld.bat 
      build.sh 
      meta.yaml 
    /src 
     /data 
      __init__.py 
      reader.py 
      data.csv #PROBLEM AREA  
     __init__.py 
     module1.py 
    setup.py 
    README.rst 

だから、問題は、ファイルreader.pyは、データフレームにcsvファイル を読み取るためにpandasを使用していることです。 Module1は、readerを呼び出してデータを取得します。

ので、コードのような設定である:

##reader.py 

import pandas as pd 
class Reader(): 

    def read(): 
    return pd.read_csv('data.csv') 

次にモジュール1に私がようなコードを持っている:

##module1.py 

from .data.reader import Reader 
import pandas as pd 

def main(): 
    dat = Reader.read() 
    print(dat.head()) 

私はdata.csvについて奇数エラーが存在しません取得していますどこだから、これはあります。今度は Readerクラスと data.csvファイルが同じフォルダにあるため、この場合は相対インポートは必要ありません。はい何らかの理由で私はこれを得ます 奇妙なエラーメッセージ。

data.csvファイルは、MANIFEST.inファイルに含まれています。

私のsetup.pyはこのようです。

try: 
    from setuptools import setup 
except ImportError: 
    from distutils.core import setup 

setup(
    name='pkg', 
    version='0.6.0', 
    description="desc", 
    long_description=readme + '\n\n' + history, 
    author="me", 
    author_email='me', 
    url='https://github.com/.../pkg', 
    packages=[ 
     'pkg', 
    ], 
    package_dir={'pkg': 
       'pyugend'}, 
    package_data={ 
     'mydata': ['pkg/data/*.csv'], 
    }, 
    include_package_data=True, 
    install_requires=requirements, 
    license="ISCL", 
    zip_safe=False, 
    keywords='pkg', 
    classifiers=[ 
     'Development Status :: 2 - Pre-Alpha', 
     'Programming Language :: Python :: 3.6', 
    ], 
    test_suite='tests', 
    tests_require=test_requirements 
) 

そしてmeta.yamlファイルはかなりバニラすぎる:reader.pyが存在する場所にもかかわらず

package: 
    name: pkg 
    version: "0.6" 

source: 
    git_url: https://github.... 

build: 
    # noarch_python: True 
    # preserve_egg_dir: True 
    entry_points: 


requirements: 
    build: 
    - python 


    run: 
    - python 
    - numpy 
    - pandas 
    - docopt 
    - matplotlib 

about: 

    license: MIT License 

答えて

1

は、作成したのPythonのインスタンスがからの場合は開始ローカルディレクトリで実行されています。つまり、C:\Users\krishnabにCMDプロンプト(または端末)を開いてPythonを起動すると、そのPythonインスタンスの基点場所はC:\Users\krishnabになります。

pd.read_csv('data.csv')が呼び出されると、Pythonは現在の作業ディレクトリ(C:\Users\krishnab)でdata.csvを探します。


追加の空のpythonファイルを/ dataに追加できます。これは、data.csvのディレクトリを取得するためにのみ使用されます。

/src 
    /data 
     __init__.py 
     reader.py 
     data.csv 
     other.py 

other.pyは内容があります。reader.py

# other.py 
pass 

あなたがotherをインポートし、パスを取得するために__file__属性を使用することができます。 reader.py

内容:

from . import other 
import pandas as pd 
import os 
data_dir = os.path.dirname(os.path.abspath(other.__file__)) 

class Reader: 
    def read(self): 
     return pd.read_csv(data_dir+'/data.csv') 
+0

さて、私はあなたの作業ディレクトリについて言っているものを手に入れます。しかし、データファイルが置かれている相対ディレクトリを参照するにはどうすればいいですか?私は 'os'パッケージなどを使う必要がありますか? – krishnab

+0

データファイルへのパスを取得する方法に関する追加情報を更新しました。 – James

+0

これは大丈夫です。助けてくれてありがとう@James。興味深いことに、私はこれまで相対パスでこの問題に遭遇していませんでしたが、今は論理を見ることができます。それはすべて動作します。 – krishnab

関連する問題