わかりました...モジュールx
がどこにあるかわかりませんが、ディレクトリへのパスを2レベル上に取得する必要があることはわかっています。
それで、もっとエレガントな方法はありますか?
import os
two_up = os.path.dirname(os.path.dirname(__file__))
Python2とPython3の両方のソリューションを歓迎します!
回答:
を使用できますpathlib
。残念ながら、これはPython3.4のstdlibでのみ使用できます。古いバージョンを使用している場合は、ここでPyPIからコピーをインストールする必要があります。これは、を使用して簡単に実行できるはずpip
です。
from pathlib import Path
p = Path(__file__).parents[1]
print(p)
# /absolute/path/to/two/levels/up
これは、parents
親ディレクトリへのアクセスを提供し、2番目のディレクトリを選択するシーケンスを使用します。
p
この場合Path
、独自のメソッドを持つ何らかの形式のオブジェクトになることに注意してください。パスを文字列として必要な場合はstr
、それらを呼び出すことができます。
Path
クラスparents
は実行場所に依存するため、これは受け入れられる答えではありません。__file__
現在のディレクトリから実行する場合、Path
クラスには親がありません。@ Sebi2020の回答を受け入れるか、元の方法を使用する必要があります。あなたのオリジナルの方法はもっと読みやすいと思います。
p = Path(os.path.abspath(__file__)).parents[1]
os.path.abspath
、次を使用することもできますPath(__file__).resolve().parents[1]
p = Path(__file__).resolve().parents[1]
です。私も答えとして追加しました。
非常に簡単:
これがあなたが望むものです:
import os.path as path
two_up = path.abspath(path.join(__file__ ,"../.."))
os.pardir
なく使用します..
。
__file__
。
個人的には、以下に概説するように、osモジュールを使用するのが最も簡単な方法だと思います。1レベルしか上がらない場合は、( '../ ..')を( '..')に置き換えます。
import os
os.chdir('../..')
--Check:
os.getcwd()
これを一般的な解決策として使用できます。
import os
def getParentDir(path, level=1):
return os.path.normpath( os.path.join(path, *([".."] * level)) )
より多くのクロスプラットフォーム実装は次のようになります。
import pathlib
two_up = (pathlib.Path(__file__) / ".." / "..").resolve()
使用parent
はWindowsではサポートされていません。また.resolve()
、を追加する必要があります:
パスを絶対にし、途中のすべてのシンボリックリンクを解決し、正規化します(たとえば、Windowsでスラッシュをバックスラッシュに変換します)
parent
Windowsで動作しないためのソースはありますか?このコメントを書いてから、これはいつか修正されたようです。Windows10でPython3.7.2を使用すると、問題なく動作します。
parent
Python3.6.5でWindows10で作業することができました。@Zhukovgeenについて話しているPythonのバージョンはどれですか?
xzyという名前のフォルダーにアクセスする場合、Pythonファイルの2つ上のフォルダーにアクセスします。これは私とプラットフォームに依存せずに機能します。
".././xyz"
追加の依存関係をインストールする必要がなく、ファイルのディレクトリから開始する2.7の実行可能な答えはまだ見つかりません。単一行のソリューションとしては良くありませんが、標準のユーティリティを使用しても問題はありません。
import os
grandparent_dir = os.path.abspath( # Convert into absolute path string
os.path.join( # Current file's grandparent directory
os.path.join( # Current file's parent directory
os.path.dirname( # Current file's directory
os.path.abspath(__file__) # Current file path
),
os.pardir
),
os.pardir
)
)
print grandparent_dir
そして、それが機能することを証明するために、ここでは~/Documents/notes
、現在のディレクトリが結果に影響を与えないことを示すために始めます。grandpa.py
そのスクリプトを含むファイルを「scripts」というフォルダーに入れました。Macの場合はDocumentsdirに移動し、次にuserdirに移動します。
(testing)AlanSE-OSX:notes AlanSE$ echo ~/Documents/scripts/grandpa.py
/Users/alancoding/Documents/scripts/grandpa.py
(testing)AlanSE-OSX:notes AlanSE$ python2.7 ~/Documents/scripts/grandpa.py
/Users/alancoding
これは、親dirの答えの明らかな外挿です。より少ない行であまり良くないソリューションよりも一般的なソリューションを使用する方が良いです。
pathlib
解決策は少しよりよい、より読みやすいですが、Pythonの2.7には含まれていません。私はあなたが持っているものに固執すると言うでしょう、多分コメントを追加してください。