如何解决Python 2.7上缺少的`exist_ok`问题?

时间:2017-07-24 14:24:08

标签: python-2.7 os.path

在Python 2.7 os.makedirs()上缺少exist_ok。这仅适用于Python 3。

我知道这是一项有效的工作:

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

我可以创建自定义my_make_dirs()方法并使用它,而不是os.makedirs(),但这并不好。

如果你被迫支持Python 2.7,最诡计多端的工作是什么?

AFAIK python-futuresix在这里没有帮助。

5 个答案:

答案 0 :(得分:13)

一种方法是使用pathlib。它有一个backport for Python 2,其mkdir()函数支持exist_ok

try:
  from pathlib import Path
except ImportError:
  from pathlib2 import Path  # python 2 backport

Path(settings.STATIC_ROOT).mkdir(exist_ok=True)

答案 1 :(得分:5)

您可以在检查路径不存在后调用makedirs():

import os

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

答案 2 :(得分:0)

您正在做的事情可能很好,但如果您想要检测和调整,您可以在运行时进行monkeypatch。我不会说这是最好的主意,它可能导致一些奇怪的可能性,但根据你的情况,它可能很好。至少,在这段代码中加入一些文档,以便下一个人或者gal知道发生了什么。

以下是一个示例 - 您可以使用" true"运行此脚本。或其他东西作为论据,看看差异。

使用sys.version_info检测python的版本:https://docs.python.org/2/library/sys.html#sys.version_info https://docs.python.org/3/library/sys.html#sys.version_info

import sys
import os


def blah(a):
    return "lskdflsdkfj"


if sys.argv[1] == "true":
    os.listdir = blah

print(os.listdir('.'))

答案 3 :(得分:0)

def makedirs(name, exist_ok=False):
    if not os.path.exists(name) or not exist_ok:
        os.makedirs(name)

答案 4 :(得分:0)

接受的答案不完整,因为os.makedirs()会递归创建子文件夹,而Path.mkdir()os.mkdir()一样,只能在现有位置创建新目录。另一种方法是利用抛出的异常来区分和容忍Python2 / 3之间的行为。

import errno
import os
import os.path

def makedirs(folder, *args, **kwargs):
  try:
    return os.makedirs(folder, exist_ok=True, *args, **kwargs)
  except TypeError: 
    # Unexpected arguments encountered 
    pass

  try:
    # Should work is TypeError was caused by exist_ok, eg., Py2
    return os.makedirs(folder, *args, **kwargs)
  except OSError as e:
    if e.errno != errno.EEXIST:
      raise

    if os.path.isfile(folder):
      # folder is a file, raise OSError just like os.makedirs() in Py3
      raise

另请参阅:Python "FileExists" error when making directory