Python:ディレクトリを2レベル上に取得


90

わかりました...モジュールxがどこにあるかわかりませんが、ディレクトリへのパスを2レベル上に取得する必要があることはわかっています。

それで、もっとエレガントな方法はありますか?

import os
two_up = os.path.dirname(os.path.dirname(__file__))

Python2とPython3の両方のソリューションを歓迎します!


1
私はあなたの解決策は完全に素晴らしいと思います。pathlib解決策は少しよりよい、より読みやすいですが、Pythonの2.7には含まれていません。私はあなたが持っているものに固執すると言うでしょう、多分コメントを追加してください。
jme 2015年

おそらくpip install pathlib2、2.7で正気を維持するためのオプションを追加する価値があります。
ヨナサン

回答:


108

を使用できます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、それらを呼び出すことができます。


それは素晴らしい答えのおかげで、py3にとって素晴らしいことです。py2の場合、追加の依存関係が作成されるため、最初の試みよりも優れている可能性はありません
jramm 2015年

16
Pathクラスparentsは実行場所に依存するため、これは受け入れられる答えではありません。__file__現在のディレクトリから実行する場合、Pathクラスには親がありません。@ Sebi2020の回答を受け入れるか、元の方法を使用する必要があります。あなたのオリジナルの方法はもっと読みやすいと思います。
Red-Tune-84

1
あなたがする必要があるかもしれませんp = Path(os.path.abspath(__file__)).parents[1]
Adam Raudonis 2018年

4
@AdamRaudonisの代わりにos.path.abspath、次を使用することもできますPath(__file__).resolve().parents[1]
Tulio Casagrande

7
@Kazanzが述べたように、このソリューションは他のパスから実行する場合は機能しません。最善の解決策は次のとおりp = Path(__file__).resolve().parents[1]です。私も答えとして追加しました。
pythinker 2018年

48

非常に簡単:

これがあなたが望むものです:

import os.path as path

two_up =  path.abspath(path.join(__file__ ,"../.."))

10
そして、おそらくではos.pardirなく使用します..
jme 2015年

sys.argv [0]はpython.exeによって実行されたモジュールを返しませんか?したがって、関心のあるモジュールが他のパッケージからインポートされた場合、これは必要ありません。私はここにいますか?
jramm 2015年

モジュールで使用する場合は、代わりにを使用してください__file__
Sebi2020 2015年

1
@jme「..」以外の文字列で親ディレクトリを取得するOSを知っていますか?
Sebi2020 2015年

1
@ Sebi2020うん、特に古いMacOS。リストは次の
とおりです。en.wikipedia.org/ wiki / Path_(computing

22

これを追加するのはばかげているだけですが、これは、エイリアス関数やインポートの潜在的な有用性を初心者に示しているためです。

それを書いたので、このコードはこれまでの他の答えよりも読みやすく(つまり意図を把握する時間が短い)、読みやすさが(通常)王様だと思います。

from os.path import dirname as up

two_up = up(up(__file__))

注:モジュールが非常に小さいか、コンテキスト的にまとまりがある場合にのみ、この種のことを実行する必要があります。


14

任意のディレクトリから実行する場合の最良の解決策(python> = 3.4の場合)は次のとおりです。

from pathlib import Path
two_up = Path(__file__).resolve().parents[1]

10

ディレクトリを2レベル上げるには:

 import os.path as path
 two_up = path.abspath(path.join(os.getcwd(),"../.."))

4

個人的には、以下に概説するように、osモジュールを使用するのが最も簡単な方法だと思います。1レベルしか上がらない場合は、( '../ ..')を( '..')に置き換えます。

    import os
    os.chdir('../..')

--Check:
    os.getcwd()

1
'/'をハードコードすることは許容されますか?os.chdir(os.join( '..'、 '..'))
GreenAsJade 2016年

2

以下は2.7.xでうまく機能することがわかりました

import os
two_up = os.path.normpath(os.path.join(__file__,'../'))

2

これを一般的な解決策として使用できます。

import os

def getParentDir(path, level=1):
  return os.path.normpath( os.path.join(path, *([".."] * level)) )

@JanSila:より具体的にすることができます、なぜそれはpythonicではないのですか?読みやすさのために、これが何をするかについてもっとコメントがあるかもしれません、はい-しかし最終的には標準のPython言語機能を使用しています、例えばstackoverflow.com/questions/36901
Axel Heider 2017年

少し密度が高いですが、抽象的すぎて読めないと思います。これは、ここに投稿された他の回答の一般化されたバージョンです。ただし、関数を実装しなくても、標準ライブラリで処理を実行できる方法が必要です。
ryanjdillon

1

より多くのクロスプラットフォーム実装は次のようになります。

import pathlib
two_up = (pathlib.Path(__file__) / ".." / "..").resolve()

使用parentはWindowsではサポートされていません。また.resolve()、を追加する必要があります:

パスを絶対にし、途中のすべてのシンボリックリンクを解決し、正規化します(たとえば、Windowsでスラッシュをバックスラッシュに変換します)


2
parentWindowsで動作しないためのソースはありますか?このコメントを書いてから、これはいつか修正されたようです。Windows10でPython3.7.2を使用すると、問題なく動作します。
Nathan19年

私はparentPython3.6.5でWindows10で作業することができました。@Zhukovgeenについて話しているPythonのバージョンはどれですか?
ggulgulia

@ggulgulia私はそれは3.7だったと信じて
zhukovgreen

1

xzyという名前のフォルダーにアクセスする場合、Pythonファイルの2つ上のフォルダーにアクセスします。これは私とプラットフォームに依存せずに機能します。

".././xyz"



-1

追加の依存関係をインストールする必要がなく、ファイルのディレクトリから開始する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の答えの明らかな外挿です。より少ない行であまり良くないソリューションよりも一般的なソリューションを使用する方が良いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.