2017-04-04 9 views
0

スクリプトの「現在の作業ディレクトリ」は、当初はスクリプトの場所ではなく、というユーザーがスクリプトを実行した場所であることがわかりました。ファイルパスの扱い方は?

スクリプトは/Desktop/Projects/pythonProject/myscript.pyであるが、私は、スクリプトを実行したとき、私は自分の端末内に/Documents/Arbitraryでね、それはそれは現在の作業ディレクトリだし、それはだからopen('data.txt')の試みは、ファイルが見つかりませんを与えるために起こっていることになるだろう場合正しいディレクトリを見ていない。

それで、どこから実行されているのか分からないと、スクリプトはファイルを開くはずです。これはどのように処理されますか?

私の最初の考えは、絶対パスを使用することでした。私のスクリプトがdata.txtを開き、そのパッケージの横にpythonProjectという名前で保存されているとします。それから私はちょうどopen('/Desktop/Projects/pythonProject/data.txt')と言うでしょう。

しかし、その中のすべてのパスを編集せずにプロジェクトを移動することはできないので、これは適切な解決策ではありません。

は、がスクリプトを実行するたびにスクリプトが置かれているディレクトリにある必要がありますか?それも正しいとは思わない。

これについて私が考えていない簡単な操作がいくつかありますか?あなたはちょうどスクリプトの冒頭にあるスクリプトの場所にos.chdirとなっていますか?

+0

'__file__'を使ってスクリプトの場所を知ることができます。 – smarx

+0

[現在実行中のファイルのパスと名前はどのように取得できますか?](http://stackoverflow.com/questions/50499/how-do-i-get-the-path-and-name) -of-the-currently-executing-executing) – congusbongus

答えて

2

にモジュールの相対パスを変換するためにos.pathで関数を使用する(私は主にbasedirにと思っていますし、参加する)ことができます。

import os 
file_dir = os.path.dirname(os.path.abspath(os.path.realpath(__file__))) 

その後、クロスプラットフォームのファイルパスを作成するためにos.path.join()使用:

os.path.join(file_dir, "test.txt") 

代わりに、電流を変更することができますあなたはos.path.joinにすべての時間を持っていないので、実行しているファイルのディレクトリに作業ディレクトリ:

os.path.chdir(os.path.dirname(os.path.abspath(os.path.realpath(__file__)))) 

なぜos.path.abspathos.path.realpathを使うのか?内側のrealpathはシンボリックリンクを解決し、abspathは相対パスを解決します。シンボリックリンクが使用されていないことがわかっている場合は、この内部のrealpathコールを省略できます。

+0

これは良い答えですが、コマンドラインパラメータとして動作するファイルの名前を受け入れ、これらの手法を使って静的それらが動作する必要があるファイル。 – cco

+0

動的ファイル名をコマンドラインパラメータとして受け入れることは、質問される質問の範囲内にはないようです。 – Julien

+0

だから私はコメントとして私の考えを追加した理由です。実際には共通のパターンであるにもかかわらず、ファイル名を代替として受け入れることを検討していないようです。あなたの答えは尋ねられた質問のための良いものです。 – cco

1

モジュールの場所は、常に__file__変数で使用できます。あなたは、現在のファイルのディレクトリパスを取得しos.path.dirnameos.path.abspathos.path.realpath、および__file__変数を使用して、絶対パス