【问题标题】:How to display messages while creating directories?创建目录时如何显示消息?
【发布时间】:2015-07-22 16:32:09
【问题描述】:

我正在寻找输入以在创建目录时打印一条消息。我在混合操作系统环境中,但在我的情况下使用 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

【问题讨论】:

    标签: python python-2.7 arcgis arcpy os.path


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 这取决于哪种情况更可能发生 - OP 是否更有可能发现目录存在或不存在?
    • 好问题 :) 但是为了可读性,短路这样的函数通常是一个好习惯(如果没有别的):)
    • 这是真的。更常见的成语当然是try/except/else
    • 我同意;这就是为什么 try/except/else 前段时间在语言中引入的原因 :) -- 但是我个人觉得 IHMO 为“尝试”而“尝试”某事,而一个简单的测试就足够了有点多余 :) -- 在实践中设置up 异常处理可能会很昂贵,具体取决于您正在做什么。
    【解决方案2】:

    您的else 子句看起来不合适。在您发布的代码中,只有在出现 OSErrordirmk 不存在时才会打印“正在创建”消息。

    在下面的这个 sn-p 中,如果在创建 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

    【讨论】:

    • 非常感谢乔梅尔。效果很好。我也感谢下面的所有评论和回复。祈祷吧,本周晚些时候我可以抽出时间来探索以下所有其他选项。
    【解决方案3】:

    您已经很接近了,但还不够。在您的try 块中,您将进入except 的唯一时间是如果有OSError...就像文件已经存在一样。所以你永远不会看到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!"
    

    【讨论】:

    • 您可以通过e.errno获取errno
    • 已编辑。我不敢相信我犯了这样一个菜鸟错误。谢谢@PadraicCunningham!
    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多