現在のファイルのディレクトリの完全パスを取得するにはどうすればよいですか?


804

現在のファイルのディレクトリパスを取得したい。私は試した:

>>> os.path.abspath(__file__)
'C:\\python27\\test.py'

しかし、どうすればディレクトリのパスを取得できますか?

例えば:

'C:\\python27\\'


5
__file__対話型シェルとしてpythonを実行する場合は定義されません。あなたの質問の最初のコードは対話型シェルからのもののように見えますが、実際NameErrorには少なくともpython 2.7.3ではを生成しますが、他のコードもそうだと思います。
drevicko

回答:


1634

Python 3

実行中のスクリプトのディレクトリ:

import pathlib
pathlib.Path(__file__).parent.absolute()

現在の作業ディレクトリ:

import pathlib
pathlib.Path().absolute()

Python 2および3

実行中のスクリプトのディレクトリ:

import os
os.path.dirname(os.path.abspath(__file__))

現在の作業ディレクトリの場合:

import os
os.path.abspath(os.getcwd())

前後に注意してください fileは1つではなく2つのアンダースコアで。

また、対話的に実行している場合や、ファイル以外のもの(データベースやオンラインリソースなど)からコードを読み込んだ__file__場合は、「現在のファイル」の概念がないため、設定されない場合があります。上記の回答は、ファイル内にあるpythonスクリプトを実行する最も一般的なシナリオを想定しています。

参考文献

  1. Pythonのドキュメントのpathlib
  2. os.path 2.7os.path 3.8
  3. os.getcwd 2.7os.getcwd 3.8
  4. __file__変数はどういう意味ですか?

43
abspath()は、dirname(file)が空の文字列を返す可能性があるウィンドウでの奇妙な動作を発見したくない場合は必須です!
ソリン

4
os.path.dirname(os.path.abspath(os .__ file__))である必要がありますか?
DrBailey 2014年

5
@DrBailey:いいえ、ActivePythonについて特別なことは何もありません。__file__(単語の両側に2つのアンダースコアがあることに注意してください)は、Pythonの標準部分です。たとえば、Cベースのモジュールでは使用できませんが、常にpythonスクリプトで使用できます。
ブライアンオークリー

10
可能なシンボリックリンクを解決するには、abspathではなくrealpathを使用することをお勧めします。
TTimo

12
@ cph2117:これは、スクリプトで実行した場合にのみ機能します。__file__対話型プロンプトから実行する場合はありません。\
ブライアンオークリー

99

PathPython 3以降、使用は推奨される方法です。

from pathlib import Path
print("File      Path:", Path(__file__).absolute())
print("Directory Path:", Path().absolute())  

ドキュメント:pathlib

注:Jupyter Notebookを使用している場合、__file__期待値を返さないため、Path().absolute()使用する必要があります。


17
Path(__file__).parentファイルが含まれているフォルダーを取得するために実行する必要があった
YellowPillow

これは正しい@YellowPillowでありPath(__file__)、ファイルを取得します。 .parent含まれるディレクトリの1つ上のレベルに移動します。さらに追加.parentして、必要な数のディレクトリを上に移動できます。
Ron Kalian

1
申し訳ありませんが、これはもっと明確にしたはずですPath().absolute()が、あるモジュールに存在し、そのモジュールにあるpath/to/moduleスクリプトからそのモジュールを呼び出すと、代わりにpath/to/script返されpath/to/scriptますpath/to/module
YellowPillow

1
@YellowPillow Path(__file__).cwd()はより明確です
Charles

1
Path(__file__)常に機能するとは限りません。たとえば、Jupyter Notebookでは機能しません。 Path().absolute()その問題を解決します。
Ron Kalian

43

Python 3.xでは、次のようにします。

from pathlib import Path

path = Path(__file__).parent.absolute()

説明:

  • Path(__file__) 現在のファイルへのパスです。
  • .parentディレクトリを提供しますファイルが。
  • .absolute()それへの完全な絶対パスを提供します。

を使用することpathlibは、パスを操作する現代的な方法です。なんらかの理由で後で文字列として必要になった場合は、そのままにしてくださいstr(path)


3
これは2019年の時点で受け入れられた回答であるはずです。回答で1つ言及することもできます。次の.open()ようなPathオブジェクトをすぐに呼び出すことができますwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
stefanct

9
import os
print os.path.dirname(__file__)

21
申し訳ありませんが、この答えは正しくありません。正しい答えは、Bryan `dirname(abspath(file))によって作成されたものです。詳細についてはコメントを参照してください。
ソリン

1
/ 出力として提供されます
Tripathi29

2
@sorin実際、Python 3.6では、どちらも同じです
DollarAkshay

5

あなたは使用することができますosし、os.path次のように簡単にライブラリー

import os
os.chdir(os.path.dirname(os.getcwd()))

os.path.dirname現在のディレクトリから上のディレクトリを返します。ファイル引数を渡さず、絶対パスを知らなくても、上位レベルに変更できます。


7
これは、現在のファイルのディレクトリを提供しません。完全に異なる可能性がある現在の作業ディレクトリのディレクトリを返します。あなたが提案することは、ファイルが現在の作業ディレクトリにある場合にのみ機能します。
ブライアンオークリー2016


2

次のコマンドはすべて、Python 3.6スクリプトの親ディレクトリの完全パスを返すことがわかりました。

Python 3.6スクリプト:

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-

from pathlib import Path

#Get the absolute path of a Python3.6 script
dir1 = Path().resolve()  #Make the path absolute, resolving any symlinks.
dir2 = Path().absolute() #See @RonKalian answer 
dir3 = Path(__file__).parent.absolute() #See @Arminius answer 

print(f'dir1={dir1}\ndir2={dir2}\ndir3={dir3}')

説明リンク:.resolve() .absolute() パス(ファイル).parent()絶対()。


2

システム:MacOS

バージョン:Python 3.6 w / Anaconda

import os

rootpath = os.getcwd()

os.chdir(rootpath)

1

PYTHONの有用なパスプロパティ:

 from pathlib import Path

    #Returns the path of the directory, where your script file is placed
    mypath = Path().absolute()
    print('Absolute path : {}'.format(mypath))

    #if you want to go to any other file inside the subdirectories of the directory path got from above method
    filePath = mypath/'data'/'fuel_econ.csv'
    print('File path : {}'.format(filePath))

    #To check if file present in that directory or Not
    isfileExist = filePath.exists()
    print('isfileExist : {}'.format(isfileExist))

    #To check if the path is a directory or a File
    isadirectory = filePath.is_dir()
    print('isadirectory : {}'.format(isadirectory))

    #To get the extension of the file
    fileExtension = mypath/'data'/'fuel_econ.csv'
    print('File extension : {}'.format(filePath.suffix))

出力: 絶対パスは、PYTHONファイルが配置されるパスです

絶対パス:D:\ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib and seaborn Part2

ファイルパス:D:\ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib and seaborn Part2 \ data \ fuel_econ.csv

isfileExist:True

isadirectory:False

ファイル拡張子:.csv


1

現在の作業ディレクトリを表示したいだけの場合

import os
print(os.getcwd)

現在の作業ディレクトリを変更したい場合

os.chdir(path)

pathは、移動する必要のあるパスを含む文字列です。例えば

path = "C:\\Users\\xyz\\Desktop\\move here"

0

IPython%pwd現在の作業ディレクトリを取得する魔法のコマンドがあります。次のように使用できます。

from IPython.terminal.embed import InteractiveShellEmbed

ip_shell = InteractiveShellEmbed()

present_working_directory = ip_shell.magic("%pwd")

IPythonでは、Jupyter Notebook %pwdを次のように直接使用できます。

present_working_directory = %pwd

5
問題はIPythonに関するものではありません
Kiro

1
@Kiro、私の解決策 IPythonを使用して質問に答えます。たとえば、誰かが新しいライブラリを使用した解決策で質問に答えた場合、私見もそれは質問への適切な答えのままです。
Nafeez Quraishi

@NafeezQuraishiソリューションは、サードパーティのライブラリと、目的の結果を達成するためにインスタンス化する必要のあるクラスを導入します。私自身、そして他の多くの人がいくつかの理由で外部ライブラリの使用を避けようとしていると思います。他に何もうまくいかなかった場合のみ、私はあなたの解決策を試します。幸いなことに、外部ライブラリを必要とせずに、目的の結果を得るために使用できる一連の組み込み関数があります。
elliotwesoff

@ elli0t、部分的に同意します。Jupyter Notebookを使用している誰かが、おそらく%pwd magicコマンドを使用する方がosのインポートよりも簡単で望ましいだろうという質問を考えてみてください。
Nafeez Quraishi

0

プラットフォーム間(macOS / Windows / Linux)で移行の一貫性を保つには、次のことを試してください。

path = r'%s' % os.getcwd().replace('\\','/')

0

現在のフォルダーを取得するために、CGIのIISでpythonを実行するときに使用する関数を作成しました。

import os 
   def getLocalFolder():
        path=str(os.path.dirname(os.path.abspath(__file__))).split('\\')
        return path[len(path)-1]

0

次のディレクトリ構造があるとしましょう:-

main / fold1 fold2 fold3 ...

folders = glob.glob("main/fold*")

for fold in folders:
    abspath = os.path.dirname(os.path.abspath(fold))
    fullpath = os.path.join(abspath, sch)
    print(fullpath)

-1
## IMPORT MODULES
import os

## CALCULATE FILEPATH VARIABLE
filepath = os.path.abspath('') ## ~ os.getcwd()
## TEST TO MAKE SURE os.getcwd() is EQUIVALENT ALWAYS..
## ..OR DIFFERENT IN SOME CIRCUMSTANCES

2
現在の作業ディレクトリは、現在のファイルのディレクトリと同じでない場合があります。ソリューションは、現在の作業ディレクトリがファイルを保持するディレクトリと同じである場合にのみ機能します。これは開発中にはかなり一般的ですが、展開されたスクリプトでは通常非常にまれです。
ブライアンオークリー

情報をありがとう。私は私の回答を更新して、これらが同じファイルパスを返すことと同等ではない可能性を反映しました。これが、「インクリメンタルプログラミング」と呼ばれるコーディングの哲学、テスト、およびテストの多くのprint()関数呼び出し、および/または方法の各ステップで値が返される理由に固執する理由です。私がすべてを知っているとは主張していないので、私のコードがos.path.abspath()とos.getcwd()の現実をよりよく反映するようになりました。ただし、コメントにos.getcwd()をメインソリューションとしてではなく、覚えてチェックする価値のある代替コードとして配置していることがわかります。
エルサレムプログラマ、

PS私は、誰かが編集し、私は...ここに掲載することを私の答えの大部分を消去:(そのような意欲の人々が彼らの答えは検閲とみじん切りしようとしている場合は、参加からだと思う。
エルサレムプログラマー

1
この回答を編集したのはあなただけです。また、あなたの編集はまだ質問に適切に答えていません。質問は具体的にはファイルのディレクトリへのパスについて尋ねており、あなたの答えは現在のディレクトリを取得することについてのみ言及しています。現在のディレクトリは、スクリプトが置かれているディレクトリと同じではない場合が多いため、これは正解ではありません。これはとは関係ありませんabspath
ブライアンオークリー

私が共有したコードは、絶対ファイルパスを知りたいディレクトリやファイルから実行した場合、ファイルのディレクトリへのパスを提供します。間違いなくそれは正解です。荒らしをしないでください。
エルサレムのプログラマ、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.