2016-11-30 7 views
1

これはプロの構造/階層を構築しようとしている私の最初のpythonプロジェクトです。Python:相対パスで非Pythonファイルをロードするサブディレクトリからモジュールをインポート

project/ 
---__init__.py 
---main.py 
---data_lib/ 
------__init__.py 
------load.py 
------file.csv 

load.pyのコードは次のとおりです:私は、次のディレクトリ構造を持っている

import pandas as pd 
def load_csv(): 
    print pd.read_csv('file.csv') 
if __name__=='__main__': 
    load_csv() 

main.pyのコードは次のとおりです。

from data_lib.load import load_csv 
load_csv() 

load.pyが実行されるとロードされたcsvファイルのpandasデータフレームのプリントアウトを取得します。 main.pyを実行すると、IOErrorエラーが発生します。File file.csvが存在しません。

if __name__=='__main__': 
    path_prefix='' 
else: 
    path_prefix='data_lib/' 

これは、標準溶液とプログラミングの練習ですか私はこれを回避し、代わりに何かをやるべき特にcsvファイルので、(:によって定義された「file.csvになり」の前に、私はパス接頭辞を追加することによってこの問題を解決することができます他のコードファイルがなければ定期的に更新する必要があります)あなたは意志、あなたがからモジュールを呼び出している場所は関係ありません

from os import path 

path_prefix = path.dirname(path.abspath(__file__)) 
csv_path = path.join(path_prefix, 'file.csv') 

この方法:

答えて

0

このような状況では一般的なイディオムは、あなたのモジュールへの絶対パスを持つすべてのファイルパスの接頭辞でありますモジュール内からリソースをロードすることができます。

説明したようにパス接頭辞を追加すると、親ディレクトリからモジュールを呼び出すときにのみ機能します。どこか他の場所から呼び出すとどうなりますか?

+0

ありがとうございました。役立ち、簡単に変更できます。この例では、ファイルfile.csvに名前を付けることに問題があることが分かりました。読者は\ __ file__はビルドイン名であり、私のファイル名には関係していないことに注意してください! – Attack68

+0

うん、 '__file__'はあなたのモジュールが呼び出されたファイルのパス名を与えるビルトインです。また、あなたの問題を解決する場合は、この回答を受け入れる価値があります。 –

関連する問題