是否有一种方法可以从Python内部获得类似于shell上的mkdir -p的功能。我正在寻找一个解决方案,而不是系统调用。我确信代码少于20行,我想知道是否有人已经写了它?
当前回答
import os
import tempfile
path = tempfile.mktemp(dir=path)
os.makedirs(path)
os.rmdir(path)
其他回答
import os
import tempfile
path = tempfile.mktemp(dir=path)
os.makedirs(path)
os.rmdir(path)
正如在其他解决方案中提到的,我们希望能够在模仿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回答的注释所指出的那样,在实际创建目录之前检查是否可以创建目录存在问题:您无法判断是否有人同时更改了文件系统。这也符合Python请求原谅的风格,而不是请求许可。
所以我们要做的第一件事就是建立目录,如果出错,找出原因。
正如Jacob Gabrielson指出的那样,我们必须寻找的一种情况是,在我们试图放置目录的地方已经存在一个文件。
使用mkdir -p:
$ touch /tmp/foo
$ mkdir -p /tmp/foo
mkdir: cannot create directory '/tmp/foo': File exists
Python中的类似行为是引发异常。
所以我们要算出是不是这样。不幸的是,我们不能。我们从makedirs得到相同的错误消息,无论目录是否存在(好)或文件是否存在,都将阻止目录的创建(坏)。
弄清楚发生了什么事的唯一方法是再次检查文件系统,看看那里是否有一个目录。如果存在,则静默返回,否则引发异常。
唯一的问题是,文件系统现在的状态可能与调用makedirs时的状态不同。例如:一个文件存在导致makedirs失败,但是现在在它的位置上有一个目录。这其实没有太大关系,因为该函数只会在最后一次文件系统调用目录时静默退出,而不会引发异常。
如果文件已经存在,Mkdir -p会给出一个错误:
$ touch /tmp/foo
$ mkdir -p /tmp/foo
mkdir: cannot create directory `/tmp/foo': File exists
因此,对前面建议的改进是,如果os.path.isdir返回False(在检查errno.EEXIST时),将重新引发异常。
(更新)看看这个高度相似的问题;我同意公认的答案(和注意事项),除了我建议os.path.isdir而不是os.path.exists。
(更新)根据评论中的建议,完整的功能看起来像:
import os
def mkdirp(directory):
if not os.path.isdir(directory):
os.makedirs(directory)
在Python中>=3.2,这是
os.makedirs(path, exist_ok=True)
在早期版本中,使用@tzot的答案。
我认为Asa的回答基本上是正确的,但你也可以将其扩展一点,使其更像mkdir -p:
import os
def mkdir_path(path):
if not os.access(path, os.F_OK):
os.mkdirs(path)
or
import os
import errno
def mkdir_path(path):
try:
os.mkdirs(path)
except os.error, e:
if e.errno != errno.EEXIST:
raise
这两种方法都可以处理路径已经静默存在但会出现其他错误的情况。
推荐文章
- 如何在matplotlib更新一个情节
- TypeError: ` NoneType `对象在Python中不可迭代
- 如何在Vim注释掉一个Python代码块
- python标准库中的装饰符(特别是@deprecated)
- 如何从外部访问本地Django web服务器
- 删除字符串的最后3个字符
- 在python中执行no-op的标准方法是什么?
- 如何从生成器构建numpy数组?
- 什么时候我应该(不)想要在我的代码中使用熊猫apply() ?
- 数据类vs类型。NamedTuple主要用例
- 如何从macOS完全卸载蟒蛇
- 是否有可能键入提示一个lambda函数?
- 'dict'对象没有has_key属性
- 使用Pandas groupby连接来自几行的字符串
- Pandas:给定列的数据帧行之和