web-dev-qa-db-ja.com

Python os.path.joinを使用して現在のディレクトリと親ディレクトリを結合する

現在のディレクトリパスと相対ディレクトリパスgoal_dirをディレクトリツリーのどこかに結合したいので、goal_dirへの絶対パスを取得します。これは私の試みです:

import os
goal_dir = os.path.join(os.getcwd(), "../../my_dir")

現在、現在のディレクトリがC:/here/I/am/の場合、C:/here/I/am/../../my_dirとして結合されますが、必要なのはC:/here/my_dirです。 os.path.joinはそれほど賢くないようです。

これどうやってするの?

22
Lewistrick

最近、pathlibを発見しました。

from pathlib import Path
cwd = Path.cwd()
goal_dir = cwd.parent.parent / "my_dir"

または、現在のスクリプトのファイルを使用します。

cwd = Path(__file__).parent
goal_dir = cwd.parent.parent / "my_dir"

どちらの場合も、簡略化された形式の絶対パスは次のようになります。

goal_dir = goal_dir.resolve()
0
Lewistrick

normpathrealpath または abspath を使用できます。

import os
goal_dir = os.path.join(os.getcwd(), "../../my_dir")
print goal_dir  # prints C:/here/I/am/../../my_dir
print os.path.normpath(goal_dir)  # prints C:/here/my_dir
print os.path.realpath(goal_dir)  # prints C:/here/my_dir
print os.path.abspath(goal_dir)  # prints C:/here/my_dir
33
alecxe

os.path.abspathの使用を検討してください。これは絶対パスを評価します

またはos.path.normpathを使用できます。これにより、正規化されたパスが返されます(パスの正規化、二重スラッシュの除去など)。

要件に応じて、これらの機能のいずれかを選択する必要があります

abspathの場合例では、os.path.joinを使用する必要はありません

os.path.abspath("../../my_dir")

相対パスに関心がある場合は、os.path.normpathを使用する必要があります。

>>> os.path.normpath("../my_dir/../my_dir")
'../my_dir'

ファイルパスを処理するためのその他のリファレンス:

  • pathlib -オブジェクト指向のファイルシステムパス
  • os.path —一般的なパス名操作
5
oleg