Pythonにディレクトリが存在するかどうかを確認する方法


1139

osPython のモジュールには、次のようなディレクトリが存在するかどうかを確認する方法があります。

>>> os.direxists(os.path.join(os.getcwd()), 'new_folder')) # in pseudocode
True/False

8
警告の言葉-最も高い評価の回答は競合状態の影響を受けやすい場合があります。os.stat代わりに、ディレクトリが存在していて、同時にディレクトリであるかどうかを確認するために実行することもできます。
d33tah 2014

1
@ d33tah良い点があるかもしれませんがos.stat、ファイルからディレクトリを識別するために使用する方法がわかりません。それが提起OSErrorパスが無効である場合、それはファイルやディレクトリのかどうかに関係なく。また、チェック後のコードも競合状態の影響を受けます。
トマーシュZato -復活モニカ

4
@TomášZato:操作を実行してエラーを処理するだけで安全であるという結論につながります。
d33tah 2015

2
@ David542「isdir」「exists」の精度をテストする明確化ケースを追加しました。今は何でも学べると思います。しかし、それは新しい人々を照らすことができました。
GeoStoneMarten 2015

回答:


1729

あなたは探しているos.path.isdir、またはos.path.existsあなたはそれがファイルやディレクトリのかどうか気にしない場合。

例:

import os
print(os.path.isdir("/home/el"))
print(os.path.exists("/home/el/myfile.txt"))

4
@syedrakib括弧はオブジェクトが呼び出し可能であることを示すために使用できますが、クラスでも呼び出し可能であるため、Pythonでは役に立ちません。また、機能はPythonでファーストクラスの値であり、あなたはそれらを使用することができずに同様に、括弧表記existing = filter(os.path.isdir(['/lib', '/usr/lib', '/usr/local/lib'])
phihag

10
などの他の関数に関数を渡すことができますがmap、一般的なケースでは、引数と括弧を使用して関数を呼び出します。また、あなたの例にはいくつかのタイプミスがあります。おそらくを意味しfilter(os.path.isdir, ['/lib', '/usr/lib', '/usr/local/lib'])ます。
hughdbrown 2013年

4
また、os.path.isfile(path)それがファイルであるかどうかだけを気にする場合もあります。
ニコラス

2
一部のプラットフォームでは、ファイル/ディレクトリが存在する場合、これらはfalseを返しますが、読み取り権限エラーも発生することに注意してください。
カウリネーター

74

とても近い!現在存在するディレクトリの名前を渡した場合にos.path.isdir返されますTrue。存在しない場合やディレクトリでない場合は、を返しますFalse


70

Python 3.4はpathlibモジュールを標準ライブラリに導入ました。これは、ファイルシステムパスを処理するためのオブジェクト指向アプローチを提供します。オブジェクトのis_dir()およびexists()メソッドをPath使用して、質問に答えることができます。

In [1]: from pathlib import Path

In [2]: p = Path('/usr')

In [3]: p.exists()
Out[3]: True

In [4]: p.is_dir()
Out[4]: True

パス(および文字列)は、/演算子で結合できます。

In [5]: q = p / 'bin' / 'vim'

In [6]: q
Out[6]: PosixPath('/usr/bin/vim') 

In [7]: q.exists()
Out[7]: True

In [8]: q.is_dir()
Out[8]: False

Pathlibは、PyPiのpathlib2モジュールを介し Python 2.7でも利用できます


いくつかの説明が役に立ちます。なぜあなたは " p / 'bin' / 'vim'
Nathan

1
@フランク回答の後半について少し詳しく説明しました。
joelostblom

34

はい、使用しますos.path.exists()


23
パスがディレクトリであることは確認されません。
カークストラウザー2012年

7
よかった。他の人はそれos.path.isdirがそれを達成するだろうと指摘しました。
aganders3 2012年

3
これが質問に答えないことを理解したら、答えを削除してみませんか?

3
@CamilStapsこの質問は(現在)354000回閲覧されました。ここでの回答はOPだけでなく、なんらかの理由でここに来ることができる人のためのものです。aganders3の答えは、OPの問題を直接解決しなくても適切です。
ガブリエル

4
@Gabrielの場合は、これが実際に何をしているのかを答えで明らかにする必要があります。

21

2つの組み込み機能で確認できます

os.path.isdir("directory")

指定されたディレクトリが利用可能であるというブール値trueを与えます。

os.path.exists("directoryorfile")

指定されたディレクトリまたはファイルが利用可能な場合、これはbooleadにtrueを与えます。

パスがディレクトリかどうかを確認するには、

os.path.isdir("directorypath")

パスがディレクトリの場合、ブール値をtrueにします


2
これは、古いトップの回答では完全に冗長です。
デイビスヘリング


10

のように:

In [3]: os.path.exists('/d/temp')
Out[3]: True

たぶんos.path.isdir(...)確かにトス。


10

os.statバージョン(python 2)を提供するだけです。

import os, stat, errno
def CheckIsDir(directory):
  try:
    return stat.S_ISDIR(os.stat(directory).st_mode)
  except OSError, e:
    if e.errno == errno.ENOENT:
      return False
    raise

7

osはこれらの機能の多くを提供します:

import os
os.path.isdir(dir_in) #True/False: check if this is a directory
os.listdir(dir_in)    #gets you a list of all files and directories under dir_in

入力パスが無効な場合、listdirは例外をスローします。


5
#You can also check it get help for you

if not os.path.isdir('mydir'):
    print('new directry has been created')
    os.system('mkdir mydir')

6
pythonにはディレクトリを作成するための組み込み関数があるため、os.makedirs('mydir')代わりに使用する方がよいos.system(...)
gizzmole

9
あなたは、その印刷されている「新しいディレクトリが作成された」しかし、あなたはそれを知りません。ディレクトリを作成する権限がない場合はどうなりますか?あなたは、印刷し「新しいディレクトリが作成された」しかし、それは真実ではないでしょう。それでしょうか。
Wojciech Jakubas 2018

4

便利なUnipathモジュールがあります。

>>> from unipath import Path 
>>>  
>>> Path('/var/log').exists()
True
>>> Path('/var/log').isdir()
True

あなたが必要とするかもしれない他の関連したもの:

>>> Path('/var/log/system.log').parent
Path('/var/log')
>>> Path('/var/log/system.log').ancestor(2)
Path('/var')
>>> Path('/var/log/system.log').listdir()
[Path('/var/foo'), Path('/var/bar')]
>>> (Path('/var/log') + '/system.log').isfile()
True

pipを使用してインストールできます。

$ pip3 install unipath

組み込みのに似ていpathlibます。違いは、すべてのパスを文字列として扱う(Pathのサブクラスであるstr)ため、一部の関数が文字列を予期している場合は、簡単にそれを渡すことができますPath必要とする場合は、文字列に変換する必要なしにオブジェクトにます。

たとえば、これはDjangoやsettings.py

# settings.py
BASE_DIR = Path(__file__).ancestor(2)
STATIC_ROOT = BASE_DIR + '/tmp/static'

4

そこにない場合は、ディレクトリを作成することもできます。

ソース(SOにまだ存在する場合)。

================================================== ===================

Python≥3.5では、次を使用しますpathlib.Path.mkdir

from pathlib import Path
Path("/my/directory").mkdir(parents=True, exist_ok=True)

古いバージョンのPythonでは、品質に優れた2つの回答があり、それぞれに小さな欠陥があるので、私はそれについて説明します。

を試して、作成os.path.existsを検討os.makedirsしてください。

import os
if not os.path.exists(directory):
    os.makedirs(directory)

コメントや他の場所で述べたように、競合状態があります。と呼び出しの間にディレクトリが作成されるos.path.existsと、os.makedirsはでos.makedirs失敗しますOSError。残念ながら、包括的キャッチOSErrorと継続は完全なものではありません。それは、不十分な許可、フルディスクなどのような他の要因によるディレクトリの作成の失敗を無視するためです。

1つのオプションは、をトラップしOSErrorて埋め込みエラーコードを調べることです(「PythonのOSErrorから情報を取得するクロスプラットフォームの方法はありますか?」を参照)。

import os, errno

try:
    os.makedirs(directory)
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

または、2番目の os.path.exists、最初のチェックの後で別のがディレクトリを作成し、チェックの前にそれを削除したとします。

アプリケーションによっては、同時操作の危険性は、ファイルのアクセス許可などの他の要因によってもたらされる危険性よりも多い場合と少ない場合があります。開発者は、実装を選択する前に、開発中の特定のアプリケーションとその予想される環境について詳しく知る必要があります。

Pythonの最新バージョンでは、FileExistsError(3.3以降で)公開することにより、このコードをかなり改善しています...

try:
    os.makedirs("path/to/directory")
except FileExistsError:
    # directory already exists
    pass

...と可能にすることによりするキーワード引数os.makedirsと呼ばれるexist_ok(3.2以上にします)。

os.makedirs("path/to/directory", exist_ok=True)  # succeeds even if directory exists.

0

2つのこと

  1. ディレクトリが存在するかどうかを確認しますか?
  2. そうでない場合は、ディレクトリを作成します(オプション)。
import os
dirpath = "<dirpath>" # Replace the "<dirpath>" with actual directory path.

if os.path.exists(dirpath):
   print("Directory exist")
else: #this is optional if you want to create a directory if doesn't exist.
   os.mkdir(dirpath):
   print("Directory created")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.