4

我正在寻找输入以在创建目录时打印消息。我在混合操作系统环境中,但在我的情况下使用 Win 7、python 2.7、ArcGIS 10.2。

就功能而言,下面的代码可以正常工作,如果目录确实存在,则消息会出现在屏幕上,但是当 os.makedirs 实际上创建不存在的目录并且我想要代码时,我无法将消息返回到屏幕要做到这一点。

我使用过 Google 和 Stackoverflow,遇到了许多处理 os.makdir 的示例,但没有找到任何可以解决我的问题的示例,这与Check if Dir Exists相似但不同

    td = arcpy.env.workspace

    dn1 = "Test" dirmk = td +sep+ dn1

    try:
        os.makedirs(dirmk) except OSError:
        if os.path.exists(dirmk):
            print '\n' + dn1 + " dir already exists so keep on hustlin"
        else:
            print '\n' + "Creating " + dn1
4

3 回答 3

6

你的else条款看起来不合适。在您发布的代码中,只有在OSError发生 ANDdirmk不存在时才会打印“正在创建”消息。

在下面的这段代码中,如果在创建时没有遇到错误,将打印“已创建”消息dirmk

td = arcpy.env.workspace

dn1 = "Test"
dirmk = td + sep + dn1

try:
    os.makedirs(dirmk)
except OSError:
    if os.path.exists(dirmk):
        print '\n' + dn1 + " dir already exists so keep on hustlin"
else:
    print '\n' + "Created " + dn1

这是满足您的用例的现有代码的最小更改。但是您可以通过执行类似于另一个答案中的建议的操作来使其更加简洁和 Pythonic:https ://stackoverflow.com/a/30180115/460282

于 2015-05-12T01:11:51.400 回答
3

你很近,但不完全在那里。在您的try块中,您将进入的唯一时间except是如果有一个OSError...like 该文件已经存在。所以你永远不会看到这个Creating...消息。

这应该会更好:

import os  # In your original, you weren't importing this.

td = arcpy.env.workspace

dn1 = "Test"
dirmk = td + sep + dn1

try:
    os.makedirs(dirmk)

except OSError, e:
    if e.errno == 17:  # Error code for file exists
        print '\n' + dn1 + " dir already exists so keep on hustlin"
    else:
        print "OSError %s" % e

else:
    print '\n' + "'" + dn1 + "' created!"
于 2015-05-12T01:13:30.830 回答
2

重新排列您的代码,使其显示为:

if not os.path.exists(dirmk):
    print "Creating: {}".format(dirmk)
    os.makedirs(dirmk)
else:
    print "{} already exists; skipping".format(dirmk)

你已经在尝试使用os.path.exists(),所以在一个条件下使用它。

如果路径不存在;创建它并打印一条消息;否则跳过。

另一种方法是使用try/except/else.

更新:当然,我可以理解为什么您可能想在此处使用,但无论路径是否存在,try/except/else您都在调用 IHMO 。os.makedirs()所以我会这样做作为对 catch 和OSError(s) 的改进:

if not os.path.exists(dirmk):
    print "Creating: {}".format(dirmk)
    try:
        os.makedirs(dirmk)
    except:
        print "Failed to create {}".format(dirmk)
else:
    print "{} already exists; skipping".format(dirmk)

如果将其编写为可重用函数,则可以将其短路为:

def create_if_not_exists(dirmk):
    if os.path.exists(dirmk):
        print "{} already exists; skipping".format(dirmk)  
        return

    print "Creating: {}".format(dirmk)

    try:
        os.makedirs(dirmk)
    except:
        print "Failed to create {}".format(dirmk)
于 2015-05-12T01:11:41.693 回答