質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1714閲覧

(Python) 別のディレクトリにあるファイルをopenできない

masatoemata

総合スコア7

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/22 13:39

編集2021/09/22 13:45

ファイルが存在する場所を指定しているつもりですが,どうしても「FileNotFoundError」が発生してしまいます。
原因がどうしても分からず詰まっているので,どなたかお助けください。。。

※前回質問させていただいた「(Python) 別のディレクトリにあるファイルをimportできない」と似た系統の質問となり大変恐縮です...。

パスの指定の仕方で誤りがあるのか,それともそのほかの原因が考えられるのかなどアドバイスいただければ幸いです....!

##ディレクトリ構造

projectX ★カレントディレクトリ |_apps |_configurator.py ★実行ファイル |_users |_demo |_config.yml ★欲しいファイル

イメージ説明

##実行ファイル

python

1apps/configurator.py 2 3import yaml 4import os, sys 5class Configurator: 6 @classmethod 7 def user_config(cls, user_name): 8 os.chdir(os.path.dirname(os.path.abspath(__file__))) 9 sys.path.append('..') 10 # print(os.getcwd()) 11 config_path = f'users/{user_name}/config.yml' 12 with open(config_path, "r", encoding='utf-8') as yaml_file: 13 config = yaml.load(yaml_file, Loader=yaml.FullLoader) 14 return config 15 16 17if __name__ == "__main__": 18 config = Configurator.user_config("demo") 19 print(config)

##実行結果

cmd

1~\projectX 2$ python .\apps\configurator.py 3 4Traceback (most recent call last): 5 File "C:\Users\masat\projectX\apps\configurator.py", line 16, in <module> 6 config = Configurator.user_config("demo") 7 File "C:\Users\masat\projectX\apps\configurator.py", line 10, in user_config 8 with open(config_path, "r", encoding='utf-8') as yaml_file: 9FileNotFoundError: [Errno 2] No such file or directory: 'users/demo/config.yml'

##備考

備考1.以下のロジックでうまくファイルを取得できる想定でした。

① 下記コードを実行することで,

python

1# apps/configurator.py 2os.chdir(os.path.dirname(os.path.abspath(__file__)))

下記のように「★カレントディレクトリ」が変更される

projectX |_apps |_configurator.py ★カレントディレクトリ ★実行ファイル ★パスの起点 |_users |_demo |_config.yml ★欲しいファイル

② 次に下記コードを実行することで,

python

1# apps/configurator.py 2sys.path.append('..')

下記のように「★パスの起点」が変更される

projectX ★パスの起点 |_apps |_configurator.py ★カレントディレクトリ ★実行ファイル |_users |_demo |_config.yml ★欲しいファイル

③ 次に下記コードを実行することで,

python

1config_path = f'users/{user_name}/config.yml' # {user_name} = 'demo' 2 with open(config_path, "r", encoding='utf-8') as yaml_file:

結果「★欲しいファイル」に到達する....という想定だったが実際は「FileNotFoundError」が発生する 涙

####備考2.カレントディレクトリを「os.chdir」でファイルの置き場所に移動している理由
この投稿では話をシンプルにするために「configurator.py」を直接実行していますが,実際は「configurator.py」は別のファイルのモジュールなので,実行ファイルの場所に依存しないようにしたいからです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/09/22 14:14

「sys.path」は「open()」とは関係ありません この場合は、カレントディレクトリが基準になります
masatoemata

2021/09/26 12:07

ご回答ありがとうございます,理解が深まりました!
guest

回答2

0

ベストアンサー

sys.pathの意味を調べましょう。これは、importするファイルの場所を指定する物です。

open等、一般のファイル操作において、相対ディレクトリの起点は、カレントディレクトリです。

投稿2021/09/22 14:55

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masatoemata

2021/09/26 12:11 編集

ご回答ありがとうございます。インポートとファイル取得に関する違いを理解できました。 ファイル取得の相対パス指定を②「sys.path('..')」でしても意味がないことが分かったので ③のファイル取得のコード「config_path = f'/users/{user_name}/config.yml'」 を「config_path = f'../users/{user_name}/config.yml'」 に変更することでうまく動くようになりました。 projectX |_apps ..|_configurator.py ★カレントディレクトリ=パスの起点=実行ファイル |_users ..|_demo ....|_config.yml ★欲しいファイル
masatoemata

2021/09/26 13:04

※問題を分離するため,「configurator.py」をモジュールとして実行する場合の「FileNotFoundError」については下記質問に移行します。 「(Python) 別のディレクトリにあるファイルをopenできない ※モジュールとして実行する場合」 https://teratail.com/questions/361444
guest

0

config_path = f'../users/{user_name}/config.yml'

ではどうなるでしょう

投稿2021/09/22 14:20

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masatoemata

2021/09/26 08:04

ご回答ありがとうございます,現状のカレントディレクトリ「apps」で実行した場合,実行ファイル「configurator.py」はうまく動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問