web-dev-qa-db-ja.com

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

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

だから、もっとエレガントな方法があります:

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

Python 2および3の両方のソリューションを歓迎します!

58
jramm

pathlib を使用できます。残念ながら、これはPython 3.4のstdlibでのみ利用可能です。古いバージョンを使用している場合、PyPI here からコピーをインストールする必要があります。これはpipを使用して簡単に実行できるはずです。

from pathlib import Path

p = Path(__file__).parents[1]

print(p)
# /absolute/path/to/two/levels/up

これは、parentsシーケンスを使用して、親ディレクトリへのアクセスを提供し、2番目のシーケンスを選択します。

この場合のpは、独自のメソッドを持つ何らかの形式のPathオブジェクトになります。文字列としてのパスが必要な場合は、それらでstrを呼び出すことができます。

75
Ffisegydd

非常に簡単:

欲しいものは次のとおりです。

import os.path as path

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

よろしくセビ

32
Sebi2020

私はこれをばかげているだけでなく、新人にエイリアス関数やインポートの潜在的な有用性を示すために追加するつもりでした。

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

from os.path import dirname as up

two_up = up(up(__file__))

注:モジュールが非常に小さい場合、または文脈的にまとまりがある場合にのみ、この種のことを行います。

20
andyhasit

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

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

任意のディレクトリから実行する場合の最適なソリューション(python> = 3.4の場合)は次のとおりです。

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

個人的には、osモジュールを使用することが、以下に概説する最も簡単な方法であることがわかりました。 1レベルだけ上がる場合は、( '../ ..')を( '..')に置き換えます。

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

--Check:
    os.getcwd()
3
M. Murphy

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

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

これを一般的なソリューションとして使用できます。

import os

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

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

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

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

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

0
Artem Zhukov