パス指定について度々質問を投稿してしまい,本当に申し訳ないのですが,
下記エラーが発生する背景をご教示いただけますと幸いです。。
FileNotFoundError: [Errno 2] No such file or directory
「ファイル操作における相対ディレクトリの起点は、カレントディレクトリである」ということを念頭に置いて,ファイル取得を行うコードを書きました。具体的には,カレントディレクトリや実行ファイルパスに影響が出ないようにカレントディレクトリを「os.chdir」により固定しています。それにも関わらず,なぜエラーが発生するのでしょうか?
#ファイルをうまく取得できるケース
下記のようなディレクトリ構造においてファイルを実行したとき,ファイルをうまく取得できました。
※ちなみにこれは,前回の質問「(Python) 別のディレクトリにあるファイルをopenできない」が解決した成果です。
projectX |_apps ★ファイル実行時点のカレントディレクトリ=ファイル取得時点のカレントディレクトリ |_configurator.py ★実行ファイル |_users |_demo |_config.yml ★欲しいファイル
python
1# ~/projectX/apps カレントディレクトリ 2# $configurator.py 実行ファイルパス 3 4class Configurator: 5 @classmethod 6 def user_config(cls, user_name): 7 os.chdir(os.path.dirname(os.path.abspath(__file__))) #カレントディレクトリをこのファイル自身のディレクトリに移動 8 print(os.getcwd()) # C:\Users\masat\projectX\apps がいつでも出力される 9 config_path = f'../users/{user_name}/config.yml' 10 with open(config_path, "r", encoding='utf-8') as yaml_file: 11 ... 12 13if __name__ == "__main__": 14 config = Configurator.user_config("demo") 15 print(config) 16
#ファイルをうまく取得できないケース
####①カレントディレクトリは同じ,かつ,異なるパスにあるファイルを実行した場合
上記「configurator.py」をモジュールとして使う別ファイルを実行すると,ファイル取得(open)ができず「FileNotFoundError」が発生しました。
projectX |_apps ★カレントディレクトリ=ファイル取得時点のカレントディレクトリ |_configurator.py ★モジュールとして利用 |_bigquery_app |_base.py ★実行ファイル |_users |_demo |_config.yml ★欲しいファイル
python
1# ~/projectX/apps カレントディレクトリ 2# $bigquery_app/base.py 実行ファイルパス 3 4os.chdir(os.path.dirname(os.path.abspath(__file__))) 5sys.path.append('..') #これはimportのパスの起点には影響するがファイル取得(カレントディレクトリ)には影響しない※前回の質問でご教示いただいた内容 6from configurator import Configurator 7class BigqueryBase: 8 def __init__(self, ...): 9 ... 10 self.config = Configurator.user_config(user_name)['system'] # configurator.pyのwith open() を実行 11 ...
####②カレントディレクトリが異なるファイルを実行した場合
当然のように下記の場合も同様のエラーが出ました。
projectX |_apps ★ファイル取得時点のカレントディレクトリ |_configurator.py ★モジュールとして利用 |_bigquery_app ★ファイル実行時点のカレントディレクトリ |_base.py ★実行ファイル |_users |_demo |_config.yml ★欲しいファイル
回答2件
あなたの回答
tips
プレビュー