ネストされたディレクトリを安全に作成するにはどうすればよいですか?


4249

ファイルが書き込まれるディレクトリが存在するかどうかを確認し、存在しない場合はPythonを使用してディレクトリを作成する最もエレガントな方法は何ですか?これが私が試したものです:

import os

file_path = "/my/directory/filename.txt"
directory = os.path.dirname(file_path)

try:
    os.stat(directory)
except:
    os.mkdir(directory)       

f = file(filename)

どういうわけか、私は逃したos.path.exists(カンジャ、ブレア、ダグラスに感謝)。これは私が今持っているものです:

def ensure_dir(file_path):
    directory = os.path.dirname(file_path)
    if not os.path.exists(directory):
        os.makedirs(directory)

これを自動的に行う「オープン」のフラグはありますか?


27
一般に、ファイル名にディレクトリがない場合を考慮する必要があります。私のマシンでは、dirname( 'foo.txt')は ''を返しますが、これは存在せず、makedirs()が失敗します。
ブライアンホーキンス、

11
Python 2.7にos.path.mkdirは存在しません。ですos.mkdir
drevicko 2013

6
パスが存在する場合、それがディレクトリであり、通常のファイルや別のオブジェクトではないことを確認するだけでなく(多くの回答はこれを確認してください)、書き込み可能かどうかを確認することも必要です(これを確認した回答が見つかりませんでした)
miracle173 2014

9
場合は、ファイルパス文字列の親ディレクトリを作成するためにここに来てp、ここに私のコードスニペットは、次のとおりです。os.makedirs(p[:p.rindex(os.path.sep)], exist_ok=True)
Thammeゴウダ

回答:


5193

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、最初のチェックの後で別のがディレクトリを作成し、2番目のチェックの前にそれを削除したとします。

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

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.

5
競合状態は良い点ですが、stackoverflow.com/questions/273192/#273208のアプローチは、ディレクトリの作成の失敗を隠します。投票に気を悪くしないでください-あなたは答えが好きではありません。それが投票の目的です。
ブレアコンラッド

27
os.path.exists()は無料ではないことに注意してください。通常の場合は、ディレクトリが存在することになりますが、そうでない場合は例外として処理する必要があります。つまり、ファイルを開いて書き込み、OSError例外をキャッチし、errnoに基づいてmakedir()を実行して、再試行または再レイズを試みます。これにより、書き込みをローカルメソッドでラップしない限り、コードが重複します。
Andrew

22
os.path.existsTrueファイルに対しても戻ります。これに対処するための回答を投稿しました。
Acumenus 2013

13
ここで他の回答へのコメント者が述べたように、Python 3.2以降、パスの以前の存在がどのように処理されるかをカバーするためにexists_okパラメーターをos.makedirs()使用できます。
ボブル

6
os.mkdirs()パスセパレーターが誤って省略された場合、意図しないフォルダーが作成される可能性があります。現在のフォルダーは期待どおりではなく、パスエレメントにはパスセパレーターが含まれます。os.mkdir()これらのバグを使用すると例外が発生し、その存在を警告します。
drevicko 2013

1242

Python 3.5以降:

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

pathlib.Path.mkdir上記のように再帰的にディレクトリを作成し、ディレクトリがすでに存在する場合は例外を発生させません。親を作成する必要がない、または作成したくない場合は、parents引数をください。

Python 3.2以降:

使用pathlib

可能であれば、pathlibという名前の現在のバックポートをインストールしますpathlib2。という名前の古いメンテナンスされていないバックポートをインストールしないでくださいpathlib。次に、上記のPython 3.5以降のセクションを参照して、同じように使用します。

Python 3.4を使用している場合、に付属していますがpathlib、便利なexist_okオプションがありません。バックポートはmkdir、この欠けているオプションを含む、より新しく優れた実装を提供することを目的としています。

使用os

import os
os.makedirs(path, exist_ok=True)

os.makedirs上記のように再帰的にディレクトリを作成し、ディレクトリがすでに存在する場合は例外を発生させません。exist_okPython 3.2以降を使用している場合にのみオプションの引数があり、デフォルト値はFalseです。この引数は、2.7までのPython 2.xには存在しません。そのため、Python 2.7のように手動で例外を処理する必要はありません。

Python 2.7以降:

使用pathlib

可能であれば、pathlibという名前の現在のバックポートをインストールしますpathlib2。という名前の古いメンテナンスされていないバックポートをインストールしないでくださいpathlib。次に、上記のPython 3.5以降のセクションを参照して、同じように使用します。

使用os

import os
try: 
    os.makedirs(path)
except OSError:
    if not os.path.isdir(path):
        raise

単純なソリューションでは最初にが使用os.path.isdirされos.makedirs、その後にが使用される場合がありますが、上記のソリューションでは2つの操作の順序が逆になります。そうすることで、ディレクトリを作成する際の重複した試行に関連する一般的な競合状態を防ぎ、ファイルをディレクトリから明確にします。

例外をキャプチャして使用することerrnoは、ファイルとディレクトリの両方に対してが発生するためOSError: [Errno 17] File exists、有用性が限られていることに注意してくださいerrno.EEXIST。ディレクトリが存在するかどうかを確認するだけの方が信頼性が高くなります。

代替:

mkpathネストされたディレクトリを作成し、ディレクトリがすでに存在する場合は何もしません。これはPython 2と3の両方で機能します。

import distutils.dir_util
distutils.dir_util.mkpath(path)

パーバグ10948、この代替の厳しい制限は、それが与えられたパスのためのpythonのプロセスごとに一度だけ動作することです。つまり、それを使用してディレクトリを作成し、Pythonの内部または外部からディレクトリを削除してから、mkpathもう一度使用して同じディレクトリを再作成すると、mkpath以前にディレクトリを作成したことのある無効なキャッシュ情報が表示されずにサイレントに使用されます。実際にもう一度ディレクトリを作成します。対照的に、os.makedirsはそのようなキャッシュに依存しません。この制限は、一部のアプリケーションでは問題ない場合があります。


ディレクトリのモードについては、ドキュメントを参照してください。


13
この回答は、私が知る限り、ほとんどすべての特殊なケースをカバーしています。私はこれを "if not os.path.isdir()"でラップすることを計画していますが、ほとんど常にディレクトリが存在することを期待していて、そのようにして例外を回避できるためです。
Charles L.

5
@CharlesL。パフォーマンスが理由である場合、例外はおそらくチェックのディスクIOよりも安価です。
jpmc26 14

1
@ jpmc26ですが、makedirsはOSErrorのスローをチェックするだけの場合、追加のstat、umask、lstatを実行します。
kwarunek '19

4
潜在的なFSレース条件が導入されるため、これは間違った答えです。アーロンホールの回答をご覧ください。
Sleepycal

4
@sleepycalが言ったように、これは受け入れられた回答と同様の競合状態に悩まされています。エラーの発生とos.path.isdir他の誰かのチェックの間にフォルダーが削除されると、そのフォルダーが存在するという誤った古くて混乱するエラーが発生します。
farmir

604

try exceptを使用すると、errnoモジュールからの正しいエラーコードが競合状態を解消し、クロスプラットフォームになります。

import os
import errno

def make_sure_path_exists(path):
    try:
        os.makedirs(path)
    except OSError as exception:
        if exception.errno != errno.EEXIST:
            raise

つまり、ディレクトリを作成しようとしますが、すでに存在する場合はエラーを無視します。一方、その他のエラーは報告されます。あなたが事前にディレクトリ「A」を作成し、そこからすべての権限を削除する場合たとえば、あなたが得るだろうOSErrorとの提起errno.EACCES(許可は、エラー13を否定しました)。


24
受け入れられた回答は競合状態にあるため、実際には危険です。ただし、より単純なので、競合状態に気付いていない場合、または自分に当てはまらないと思われる場合は、それが最初の選択肢になります。
Heikki Toivonen

15
exception.errno != errno.EEXISTパスが存在するが、ファイルなどの非ディレクトリオブジェクトである場合にのみ、例外を発生させると、意図せずに無視されます。パスが非ディレクトリオブジェクトである場合、例外が発生するのが理想的です。
Acumenus 2013年

178
上記のコードは次と同等であることに注意してくださいos.makedirs(path,exist_ok=True)
Navin

58
@Navinこのexist_okパラメーターはPython 3.2で導入されました。Python 2.xにはありません。私はそれを私の答えに組み込みます。
Acumenus 2013

26
@HeikkiToivonen技術的には、別のプログラムがディレクトリとファイルを同時に変更している場合、プログラム全体が1つの巨大な競合状態になります。コードが作成した後、実際にファイルを配置する前に、別のプログラムがこのディレクトリを削除しないようにするにはどうすればよいですか?
jpmc26 2014

102

個人的には、のos.path.isdir()代わりにを使用してテストすることをお勧めしますos.path.exists()

>>> os.path.exists('/tmp/dirname')
True
>>> os.path.exists('/tmp/dirname/filename.etc')
True
>>> os.path.isdir('/tmp/dirname/filename.etc')
False
>>> os.path.isdir('/tmp/fakedirname')
False

あなたが持っている場合:

>>> dir = raw_input(":: ")

そして愚かなユーザー入力:

:: /tmp/dirname/filename.etc

...でテストすると、filename.etcその引数を渡したときに名前が付けられたディレクトリが作成されます。os.makedirs()os.path.exists()


8
「isdir」のみを使用する場合、ディレクトリを作成しようとして問題が発生し、同じ名前のファイルがすでに存在しますか?
MrWonderful 2014

3
@MrWonderful既存のファイルの上にディレクトリを作成するときに発生する例外は、呼び出し側に問題を正しく反映します。
Damian Yerrick

79

チェックos.makedirs:(完全なパスが存在することを確認します。)
ディレクトリが存在する可能性があるという事実を処理するには、をキャッチしOSErrorます。(exist_okFalse(デフォルト)のOSError場合、ターゲットディレクトリがすでに存在する場合はが発生します。)

import os
try:
    os.makedirs('./path/to/somewhere')
except OSError:
    pass

19
try / exceptを使用すると、ディレクトリが存在しないが何らかの理由でディレクトリを作成できない場合に、ディレクトリ作成のエラーをマスクします
Blair Conrad

3
OSErrorパスが既存のファイルまたはディレクトリの場合、ここで発生します。これに対処するための回答を投稿しました。
Acumenus 2013年

4
これは途中です。OSError無視することを決定する前に、のサブエラー状態を確認する必要があります。stackoverflow.com/a/5032238/763269を参照してください。
クリスジョンソン、

71

Python 3.5以降pathlib.Path.mkdir、次のexist_okフラグがあります。

from pathlib import Path
path = Path('/my/directory/filename.txt')
path.parent.mkdir(parents=True, exist_ok=True) 
# path.parent ~ os.path.dirname(path)

これにより、ディレクトリが再帰的に作成され、ディレクトリがすでに存在する場合でも例外は発生しません。

(ちょうどPython 3.2から始まるフラグをos.makedirs得たのと同じように)exist_okos.makedirs(path, exist_ok=True)


46

この状況の詳細に関する洞察

特定のファイルを特定のパスで指定し、ファイルパスからディレクトリをプルします。次に、ディレクトリがあることを確認した後、読み取り用にファイルを開こうとします。このコードにコメントするには:

filename = "/my/directory/filename.txt"
dir = os.path.dirname(filename)

組み込み関数を上書きしないようにしますdir。また、filepathおそらくこれfullfilepathは、より適切なセマンティック名であるfilenameため、これはより適切に記述されます。

import os
filepath = '/my/directory/filename.txt'
directory = os.path.dirname(filepath)

あなたの最終的な目標は、このファイルを開くことです。最初は書き込みのために述べますが、基本的にはこのように(コードに基づいて)この目標に近づき、ファイルを読み取り用に開きます。

if not os.path.exists(directory):
    os.makedirs(directory)
f = file(filename)

読書のためのオープニングを想定

そこにあるはずで読み取り可能なファイルのディレクトリを作成するのはなぜですか?

ファイルを開こうとするだけです。

with open(filepath) as my_file:
    do_stuff(my_file)

ディレクトリまたはファイルがそこにない場合、IOError関連するエラー番号errno.ENOENTが表示されます。プラットフォームに関係なく、正しいエラー番号を指します。必要に応じて、次のようにキャッチできます。

import errno
try:
    with open(filepath) as my_file:
        do_stuff(my_file)
except IOError as error:
    if error.errno == errno.ENOENT:
        print 'ignoring error because directory or file is not there'
    else:
        raise

書くために開いていると仮定します

これはおそらくあなたが望んでいることです。

この場合、おそらく競合状態に直面していません。だから、あなたがそうであったようにしてください、しかし、書くために、あなたはwモードで(またはa追加するために)開く必要があることに注意してください。Pythonのベストプラクティスは、ファイルを開くためにコンテキストマネージャを使用することでもあります。

import os
if not os.path.exists(directory):
    os.makedirs(directory)
with open(filepath, 'w') as my_file:
    do_stuff(my_file)

ただし、すべてのデータを同じディレクトリに配置しようとするいくつかのPythonプロセスがあるとします。次に、ディレクトリの作成をめぐって競合が発生する可能性があります。その場合は、makedirs呼び出しをtry-exceptブロックでラップするのが最善です。

import os
import errno
if not os.path.exists(directory):
    try:
        os.makedirs(directory)
    except OSError as error:
        if error.errno != errno.EEXIST:
            raise
with open(filepath, 'w') as my_file:
    do_stuff(my_file)

34

os.path.exists機能を試す

if not os.path.exists(dir):
    os.mkdir(dir)

3
質問にコメントするつもりでしたが、os.mkdirを意味しますか?私のpython(2.5.2)は......何のos.path.mkdirを持っていない
ブレアコンラッド

1
os.path.mkdir()方法はありません。os.pathモジュールは、パス名にいくつかの便利な関数を実装しています。
Serge S.

31

以下を書き留めておきます。しかし、それは完全に簡単ではありません。

import os

dirname = 'create/me'

try:
    os.makedirs(dirname)
except OSError:
    if os.path.exists(dirname):
        # We are nearly safe
        pass
    else:
        # There was an error on creation, so make sure we know about it
        raise

今言っているように、ディレクトリの作成に失敗したり、その間に別のプロセスがディレクトリを作成したりする可能性があるので、これは実際に完全なわけではありません。



2つの問題:(1)チェックを決定する前にOSErrorのサブエラー状態をチェックする必要があります-stackoverflow.com/a/5032238/763269をos.path.exists参照してください、(2)成功os.path.existsはディレクトリが存在することを意味せず、パスexists-ファイル、シンボリックリンク、またはその他のファイルシステムオブジェクトである可能性があります。
クリスジョンソン

24

ディレクトリが存在するかどうかを確認し、必要に応じて作成しますか?

これに対する直接の答えは、他のユーザーまたはプロセスがディレクトリをいじるのを期待しない単純な状況を想定しています:

if not os.path.exists(d):
    os.makedirs(d)

または、ディレクトリの作成が競合状態の影響を受ける場合(つまり、パスが存在することを確認した後、他の何かがすでに作成している可能性がある場合)は、次のようにします。

import errno
try:
    os.makedirs(d)
except OSError as exception:
    if exception.errno != errno.EEXIST:
        raise

しかし、おそらくさらに優れたアプローチは、次を介して一時ディレクトリを使用することにより、リソース競合の問題を回避することですtempfile

import tempfile

d = tempfile.mkdtemp()

オンラインドキュメントの要点は次のとおりです。

mkdtemp(suffix='', prefix='tmp', dir=None)
    User-callable function to create and return a unique temporary
    directory.  The return value is the pathname of the directory.

    The directory is readable, writable, and searchable only by the
    creating user.

    Caller is responsible for deleting the directory when done with it.

Python 3.5の新機能:pathlib.Pathありexist_ok

Pathパスで使用したい多くのメソッドを持つ新しいオブジェクト(3.4以降)があり、そのうちの1つはですmkdir

(コンテキストでは、毎週の担当者をスクリプトで追跡しています。同じデータで1日に複数回スタックオーバーフローにヒットすることを回避できるようにするスクリプトのコードの関連部分を次に示します。)

まず、関連するインポート:

from pathlib import Path
import tempfile

今は対処する必要はありません。os.path.joinパスのパーツを/:でです。

directory = Path(tempfile.gettempdir()) / 'sodata'

次に、べき等にディレクトリが存在することを確認します- exist_okべき引数はPython 3.5で表示されます。

directory.mkdir(exist_ok=True)

ここに関連する部分があります ドキュメントのとおりです。

場合はexist_oktrueで、FileExistsError例外は(同じ動作を無視されます。POSIX mkdir -pコマンド)が、最後のパスコンポーネントは、既存の非ディレクトリファイルでない場合のみ。

これがスクリプトのもう少しです-私の場合、私は競合状態の影響を受けません、私はディレクトリ(または含まれているファイル)が存在することを期待するプロセスが1つだけあり、削除しようとしているものはありませんディレクトリ。

todays_file = directory / str(datetime.datetime.utcnow().date())
if todays_file.exists():
    logger.info("todays_file exists: " + str(todays_file))
    df = pd.read_json(str(todays_file))

Path オブジェクトを強制する必要があります strstrパスがそれらを使用できることを期待する他のAPI が使用する前必要があります。

おそらく、パンダを更新して、抽象基本クラスのインスタンスを受け入れる必要がありますos.PathLike


20

Python 3.4では、まったく新しいpathlibモジュールを使用することもできます

from pathlib import Path
path = Path("/my/directory/filename.txt")
try:
    if not path.parent.exists():
        path.parent.mkdir(parents=True)
except OSError:
    # handle error; you can also catch specific errors like
    # FileExistsError and so on.

@JanuszSkonieczny pypi.python.org/pypi/pathlib2が新しいバックポートです。古いものはメンテナンスされていません。
Acumenus 2017

それがreadmeの最初の行で述べたように; P。しかし、古いバックポートは、ここでの答えに対してまだ有効です。そして、ネーミングの頭痛はありません。新しいユーザーpathlibがいつ、どこpathlib2で、どこで使用するのかを説明する必要はありません。ここのプロは非推奨を理解すると思います;)
Janusz Skonieczny

13

関連するPythonドキュメントは使用を示唆EAFPコーディングスタイル(許可よりも許しを求めることが容易に)。これは、コードが

try:
    os.makedirs(path)
except OSError as exception:
    if exception.errno != errno.EEXIST:
        raise
    else:
        print "\nBE CAREFUL! Directory %s already exists." % path

代替よりも優れています

if not os.path.exists(path):
    os.makedirs(path)
else:
    print "\nBE CAREFUL! Directory %s already exists." % path

この質問で説明されている競合状態のため、ドキュメントはまさにこれを示唆しています。さらに、他の人がここで言及しているように、OSを2回ではなく1回クエリすることでパフォーマンスが向上します。最後に、場合によっては、場合によっては2番目のコードを支持して、アプリケーションが実行されている環境を開発者が知っているときに提起される議論は、プログラムが自体(および同じプログラムの他のインスタンス)。

その場合でも、これは悪い習慣であり、長く役に立たないデバッグにつながる可能性があります。たとえば、ディレクトリのアクセス許可を設定しても、目的に応じて適切にアクセス許可が設定されているという印象が残りません。親ディレクトリは他の権限でマウントできます。一般に、プログラムは常に正しく動作する必要があり、プログラマーは特定の1つの環境を期待するべきではありません。


11

python3os.makedirs設定をサポートしていますexist_ok。デフォルト設定はですFalse。これはOSError、ターゲットディレクトリがすでに存在する場合にが発生することを意味します。に設定exist_okするとTrueOSError(ディレクトリが存在する)は無視され、ディレクトリは作成されません。

os.makedirs(path,exist_ok=True)

Python2os.makedirs設定をサポートしていませんexist_ok。あなたはheikki-toivonenの答えでアプローチを使うことができます:

import os
import errno

def make_sure_path_exists(path):
    try:
        os.makedirs(path)
    except OSError as exception:
        if exception.errno != errno.EEXIST:
            raise

11

ワンライナーソリューションの場合、以下を使用できますIPython.utils.path.ensure_dir_exists()

from IPython.utils.path import ensure_dir_exists
ensure_dir_exists(dir)

ドキュメントから:ディレクトリが存在することを確認します。存在しない場合は、作成して、別のプロセスが同じことを行っている場合は競合状態から保護してください。


新しいIPythonドキュメントはこちらから入手できます
jkdev 2016年

3
IPythonモジュールは、絶対に存在することが保証されていません。それは私のMacにネイティブに存在しますが、私のLinuxのPythonインストールには存在しません。基本的に、これはPython Module Indexにリストされているモジュールの1つではありません。
Acumenus 2016年

1
承知しました。パッケージをインストールするには、通常のコマンドを実行するpip install ipythonか、またはrequirements.txtまたはpom.xmlに依存関係を含めます。ドキュメント:ipython.org/install.html
tashuhka

9

使用できます mkpath

# Create a directory and any missing ancestor directories. 
# If the directory already exists, do nothing.

from distutils.dir_util import mkpath
mkpath("test")    

先祖ディレクトリも作成することに注意してください。

Python 2および3で動作します。


2
distutils.dir_utilはdistutilパブリックAPIの一部ではなく、マルチスレッド環境で問題があります:bugs.python.org/issue10948
Pod

1
はい。バグの最初のメッセージで述べたように、問題distutils.dir_util.mkpathは、ディレクトリを作成し、それをPythonの内部または外部から削除し、mkpath再度使用すると、mkpath以前に作成したディレクトリの無効なキャッシュ情報を使用するだけで、実際には再度ディレクトリを作成しません。対照的に、os.makedirsはそのようなキャッシュに依存しません。
Acumenus

8

ここでos.path.exists()ディレクトリが存在するかどうかをチェックするために使用することができますPythonの3のスクリプトで、それが存在しない場合は作成し、(必要な場合)が存在しない場合、それを削除します。

ユーザーにディレクトリの入力を求め、簡単に変更できます。


6

os.listdirこれに使用できます:

import os
if 'dirName' in os.listdir('parentFolderPath')
    print('Directory Exists')

これは質問の答えにはなりません
ジョージー

6

私はこのQ / Aを見つけましたが、最初は私が受けていたいくつかの失敗やエラーに戸惑いました。私はPython 3(Arch Linux x86_64システムのAnaconda仮想環境のv.3.5)で作業しています。

次のディレクトリ構造を検討してください。

└── output/         ## dir
   ├── corpus       ## file
   ├── corpus2/     ## dir
   └── subdir/      ## dir

これは私の実験/ノートです、それは物事を明確にします:

# ----------------------------------------------------------------------------
# [1] /programming/273192/how-can-i-create-a-directory-if-it-does-not-exist

import pathlib

""" Notes:
        1.  Include a trailing slash at the end of the directory path
            ("Method 1," below).
        2.  If a subdirectory in your intended path matches an existing file
            with same name, you will get the following error:
            "NotADirectoryError: [Errno 20] Not a directory:" ...
"""
# Uncomment and try each of these "out_dir" paths, singly:

# ----------------------------------------------------------------------------
# METHOD 1:
# Re-running does not overwrite existing directories and files; no errors.

# out_dir = 'output/corpus3'                ## no error but no dir created (missing tailing /)
# out_dir = 'output/corpus3/'               ## works
# out_dir = 'output/corpus3/doc1'           ## no error but no dir created (missing tailing /)
# out_dir = 'output/corpus3/doc1/'          ## works
# out_dir = 'output/corpus3/doc1/doc.txt'   ## no error but no file created (os.makedirs creates dir, not files!  ;-)
# out_dir = 'output/corpus2/tfidf/'         ## fails with "Errno 20" (existing file named "corpus2")
# out_dir = 'output/corpus3/tfidf/'         ## works
# out_dir = 'output/corpus3/a/b/c/d/'       ## works

# [2] https://docs.python.org/3/library/os.html#os.makedirs

# Uncomment these to run "Method 1":

#directory = os.path.dirname(out_dir)
#os.makedirs(directory, mode=0o777, exist_ok=True)

# ----------------------------------------------------------------------------
# METHOD 2:
# Re-running does not overwrite existing directories and files; no errors.

# out_dir = 'output/corpus3'                ## works
# out_dir = 'output/corpus3/'               ## works
# out_dir = 'output/corpus3/doc1'           ## works
# out_dir = 'output/corpus3/doc1/'          ## works
# out_dir = 'output/corpus3/doc1/doc.txt'   ## no error but creates a .../doc.txt./ dir
# out_dir = 'output/corpus2/tfidf/'         ## fails with "Errno 20" (existing file named "corpus2")
# out_dir = 'output/corpus3/tfidf/'         ## works
# out_dir = 'output/corpus3/a/b/c/d/'       ## works

# Uncomment these to run "Method 2":

#import os, errno
#try:
#       os.makedirs(out_dir)
#except OSError as e:
#       if e.errno != errno.EEXIST:
#               raise
# ----------------------------------------------------------------------------

結論:私の意見では、「方法2」はより堅牢です。

[1] ディレクトリが存在しない場合、どうすれば作成できますか?

[2] https://docs.python.org/3/library/os.html#os.makedirs




5

オプション付きのコマンドmkdirをサポートするマシンで実行している場合、なぜサブプロセスモジュールを使用しないの -pですか?Python 2.7およびPython 3.6で動作します

from subprocess import call
call(['mkdir', '-p', 'path1/path2/path3'])

ほとんどのシステムでトリックを実行する必要があります。

移植性が重要でない状況(例:Dockerの使用)では、解決策はクリーンな2行です。また、ディレクトリが存在するかどうかを確認するロジックを追加する必要もありません。最後に、副作用なしに再実行しても安全です

エラー処理が必要な場合:

from subprocess import check_call
try:
    check_call(['mkdir', '-p', 'path1/path2/path3'])
except:
    handle...

4

次のことを考慮した場合:

os.path.isdir('/tmp/dirname')

ディレクトリ(パス)が存在し、かつディレクトリであることを意味します。だから私にとってこの方法は私が必要とすることをします。だから私はそれがフォルダではなく(ファイルではなく)存在していることを確認できます。


これは、ディレクトリの作成に関する質問にどのように答えますか?
ジョージー

3

create_dir()プログラム/プロジェクトのエントリポイントで関数を呼び出します。

import os

def create_dir(directory):
    if not os.path.exists(directory):
        print('Creating Directory '+directory)
        os.makedirs(directory)

create_dir('Project directory')

3

ディレクトリを作成する前にフルパスを設定する必要があります:

import os,sys,inspect
import pathlib

currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
your_folder = currentdir + "/" + "your_folder"

if not os.path.exists(your_folder):
   pathlib.Path(your_folder).mkdir(parents=True, exist_ok=True)

これは私にとってうまくいき、うまくいけばあなたのためにもうまくいくでしょう


1
import os
if os.path.isfile(filename):
    print "file exists"
else:
    "Your code here"

ここのコードが(touch)コマンドを使用している場所

これにより、ファイルが存在するかどうかが確認され、存在しない場合は作成されます。

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