web-dev-qa-db-ja.com

ディレクトリが存在しない場合、os.mkdir(path)はOSErrorを返します

_os.mkdir_を呼び出して、生成された特定のデータセットを含むフォルダーを作成しています。ただし、指定したパスが作成されていなくても、os.mkdir(path)はパスが既に存在するというOSErrorを発生させます。

たとえば、私は呼び出します:

_os.mkdir(test)
_

Testディレクトリまたはtestという名前のファイルがどこにもないとしても、この呼び出しは_OSError: [Errno 17] File exists: 'test'_になります。

注:私が使用する実際のパス名は「テスト」ではありませんが、どこにも名前が付けられていないことは確かだとわかりにくいものです。

助けてください?

26
Quanquan Liu

グレッグの答えは正しいのですが、十分ではありません。 OSErrorにはサブエラー状態があり、毎回それらを抑制することは望ましくありません。 expected OSエラーのみをトラップするのが賢明です。

次のように、例外を抑制する前に追加のチェックを行ってください。

import errno
import os

try:
    os.mkdir(dirname)
except OSError as exc:
    if exc.errno != errno.EEXIST:
        raise
    pass

おそらくerrno.EACCES(許可が拒否されました)、errno.ENOSPC(デバイスにスペースが残っていません)、errno.EROFS(読み取り専用ファイルシステム)などを抑制したくないでしょう。に-しかし、それはあなたが構築しているものの特定の論理に基づいた意識的な決定である必要があります。

GregのコードはすべてのOSエラーを抑制します。 except Exceptionが安全でないように、それは安全ではありません。

38
Chris Johnson

パスが存在するかどうかを確認してください。作成しない場合

if not os.path.exists(test):
        os.makedirs(test)
29
lordkain

Python 3.2以降では、次を使用できます。

os.makedirs(path, exist_ok=True)

ディレクトリが既に存在する場合に例外が発生しないようにします。 pathが存在し、ディレクトリではない場合、これは依然として例外を発生させます。

26
1''

特に、文字列「test」に複数のディレクトリ名が含まれる場合も、同じ問題に直面しました。したがって、「test」に単一のディレクトリが含まれる場合-

if not os.path.exists(test):
    try:
        os.makedir(test)
    except:
        raise OSError("Can't create destination directory (%s)!" % (test))  

「テスト」に「\ dir1\dir2」のような複数のディレクトリが含まれている場合-

if not os.path.exists(test):
    try:
        os.makedirs(test)
    except:
        raise OSError("Can't create destination directory (%s)!" % (test))  
3
Anupam Bera

testという名前のファイルがあります。まったく同じ名前のディレクトリを作成することはできません。

1
CT Zhu

Windowsで私に起こった、多分これは事実です:

あなたのように私はしようとしていた:

os.mkdir(dirname)

OSError: [Errno 17] File exists: '<dirname>'。私が走ったとき:

os.path.exists(dirname)

私は虚偽になり、それはしばらく私を怒らせた:)

問題は、特定のウィンドウで特定のディレクトリにいたことです。その時点では存在していませんでした(Linuxから削除しました)。解決策は、そのウィンドウを閉じて\他の場所に移動することでした。恥ずかしい、知ってる...

1
Omer Dagan

ファイルシステムの詳細がわかりません。しかし、本当にこれを回避したい場合は、try/except句を使用できますか?

try:
    os.mkdir(test)
except OSError:
    print "test already exists"

その間、いつでも何らかのデバッグを行うことができます。

1
Greg

たぶん、そのディレクトリにtestという名前の隠しフォルダーがあります。存在するかどうか手動で確認してください。

ls -a

ファイルが存在しない場合にのみ作成してください。

if not os.path.exists(test):
    os.makedirs(test)
0
Tabraiz Ali

python 2.7

from distutils.dir_util import mkpath
mkpath(path)
0
Ahsan aslam