Pythonのmkdir-p関数[重複]



Mkdir P Function Python



この記事の翻訳元: Pythonのmkdir-p機能[重複]

この質問にはすでにここに答えがあります: この質問はここで答えられました:



mkdir -pと同様の機能を取得する方法はありますかPython内からシェル上で。 mkdir -p機能のようなものを取得する方法はありますか。 システムコール以外の解決策を探しています。 システムコール以外の解決策を探しています。 コードは20行未満だと確信していますが、誰かがすでにコードを書いているのではないかと思います。 コードは20行未満だと思いますが、誰かが書いたかどうか知りたいですか?


#1階

参照: https://stackoom.com/question/2W9k/mkdir-pPythonの関数-重複




#2階

Python> = 3.2では、それは Python> = 3.2では、つまり

os.makedirs(path, exist_ok=True)

以前のバージョンでは、 @tzotの答え 以前のバージョンでは、 @tzotの答え


#3階

import os import tempfile path = tempfile.mktemp(dir=path) os.makedirs(path) os.rmdir(path)

#4階

他のソリューションで述べたように、mkdir -pの動作を模倣しながら、ファイルシステムを1回ヒットできるようにする必要があります。 。 他のソリューションで述べたように、私たちは模倣できることを望んでいますmkdir -p動作は同時にファイルシステムに影響を与えます。 これが可能だとは思いませんが、できるだけ近づける必要があります。 それは不可能だと思いますが、できるだけ近づける必要があります。



最初にコードを記述し、後で説明します。 最初にコードを記述し、後で説明します。

import os import errno def mkdir_p(path): ''' 'mkdir -p' in Python ''' try: os.makedirs(path) except OSError as exc: # Python >2.5 if exc.errno == errno.EEXIST and os.path.isdir(path): pass else: raise

@tzotの回答へのコメントは、実際にディレクトリを作成する前にディレクトリを作成できるかどうかの確認に問題があることを示しているため、その間に誰かがファイルシステムを変更したかどうかはわかりません。 @tzotの回答へのコメントは、実際にディレクトリを作成する前にディレクトリを作成できるかどうかの確認に問題があることを示しているため、その間に誰かがファイルシステムを変更したかどうかはわかりません。 これは、許可ではなく許しを求めるPythonのスタイルにも適合します。 これは、許可ではなく許しを求めるPythonのスタイルとも一致しています。

したがって、最初にすべきことは、ディレクトリを作成することです。それがうまくいかない場合は、その理由を調べてください。 したがって、最初に行う必要があるのは、カタログを作成することです。問題が発生した場合は、その理由を調べます。

Jacob Gabrielsonが指摘しているように、私たちが探さなければならないケースの1つは、ディレクトリを配置しようとしている場所にファイルがすでに存在する場合です。 Jacob Gabrielsonが指摘したように、私たちが探さなければならないケースの1つは、ディレクトリに配置しようとしているファイルがすでに存在していることです。

mkdir -pを使用: 使用mkdir -p

$ touch /tmp/foo $ mkdir -p /tmp/foo mkdir: cannot create directory '/tmp/foo': File exists

Pythonでの同様の動作は、例外を発生させることです。 Pythonでの同様の動作は、例外を発生させることです。

したがって、これが当てはまるかどうかを検討する必要があります。 したがって、これが当てはまる場合は、解決する必要があります。 残念ながら、できません。 残念ながら、それはできません。 ディレクトリが存在するか(良好)、ディレクトリの作成を妨げるファイルが存在するか(不良)にかかわらず、makedirsから同じエラーメッセージが返されます。 ディレクトリが存在するか(通常)、ディレクトリの作成を妨げるファイルがあるか(不良)に関係なく、makedirsから同じエラーメッセージが表示されます。

何が起こったのかを理解する唯一の方法は、ファイルシステムを再度調べて、そこにディレクトリがあるかどうかを確認することです。 問題を見つける唯一の方法は、ファイルシステムを再度チェックして、そこにディレクトリがあるかどうかを確認することです。 存在する場合は、サイレントに戻り、存在しない場合は例外を発生させます。 存在する場合はサイレントに戻り、存在しない場合は例外が発生します。

唯一の問題は、ファイルシステムがmakedirsが呼び出されたときとは異なる状態になっている可能性があることです。 唯一の問題は、ファイルシステムがmakedirsが呼び出されたときとは異なる状態になっている可能性があることです。 例:makedirが失敗する原因となるファイルが存在しましたが、現在はディレクトリがその場所にあります。 例:makedirが失敗する原因となったファイルがありますが、現在はその場所にディレクトリがあります。 関数は、最後のファイルシステム呼び出し時にディレクトリが存在したときに例外を発生させずにサイレントに終了するだけなので、それはそれほど重要ではありません。 最後のファイルシステムがディレクトリを呼び出すと、関数は例外を発生させずにサイレントに終了するだけなので、これは重要ではありません。


#5階

最近、これを見つけました distutils.dir_util.mkpath 最近、これを見つけました distutils.dir_util.mkpath

In [17]: from distutils.dir_util import mkpath In [18]: mkpath('./foo/bar') Out[18]: ['foo', 'foo/bar']

#6階

関数宣言 関数宣言

import os def mkdir_p(filename): try: folder=os.path.dirname(filename) if not os.path.exists(folder): os.makedirs(folder) return True except: return False

使用法 : 使用法:

filename = './download/80c16ee665c8/upload/backup/mysql/2014-12-22/adclient_sql_2014-12-22-13-38.sql.gz' if (mkdir_p(filename): print 'Created dir :%s' % (os.path.dirname(filename))