web-dev-qa-db-ja.com

Python os module相対パスで現在のディレクトリの上にあるファイルを開く

OSモジュールのドキュメントには、フルパスなしでスクリプトが実行されているサブディレクトリまたは現在のディレクトリにないファイルを開く方法に関する情報がないようです。私のディレクトリ構造は次のようになります。

_/home/matt/project/dir1/cgi-bin/script.py
/home/matt/project/fileIwantToOpen.txt

open("../../fileIwantToOpen.txt","r")
_

ファイルが見つからないというエラーが発生します。しかし、私がcgi-binディレクトリでpythonインタープリターを起動してopen("../../fileIwantToOpen.txt","r")を試してみると、それは機能します。明らかな移植性のためにフルパスにハードコードしたくない[〜#〜] can [〜#〜]を実行する一連のメソッドがOSモジュールにありますか?

18
Matt Phillips

openに指定するパスは、現在の作業ディレクトリ(スクリプトを実行するディレクトリ)からの相対パスである必要があります。したがって、上記の例は、cgi-binディレクトリから実行した場合にのみ機能します。

簡単な解決策は、スクリプトに相対的なパスを作成することです。 1つの可能な解決策。

from os import path

basepath = path.dirname(__file__)
filepath = path.abspath(path.join(basepath, "..", "..", "fileIwantToOpen.txt"))
f = open(filepath, "r")

このようにして、実行中のスクリプトのパス(ベースパス)を取得し、それを開きたいファイルの相対パスと結合します。 os.pathは、2つのパスを結合する詳細を処理します。

43
terminus

これにより、スクリプトが配置されているディレクトリに移動します(まだそこにいない場合)。

file_path = os.path.dirname(__file__)
if file_path != "":
    os.chdir(file_path)
open("../../fileIwantToOpen.txt","r")
4
Andrew Clark