如何检查目录是否存在然后,如果是,请在Python中请求新的目录名称?

时间:2018-04-21 00:43:25

标签: python

首先,我是Python的完整新手,如果我的代码太可怕,那就很抱歉。这只是为了概念验证,实际的代码并不重要,只是功能。

所以我试图通过为其指定名称来创建目录。我希望程序检查具有该名称的目录是否已经存在,如果存在,请求新名称并创建该目录。检查位工作正常,但当它循环询问不同的名称时,它似乎存储原始的(副本),然后在返回时覆盖新名称。这意味着我继续获取旧目录名而不是新目录名(希望这有意义吗?)

def casefile():
    print '\n\nPlease enter a case name/reference: '
    case_name = raw_input()
    if not os.path.exists('C:\\Users\\laura17\\Documents\\ProgrammeOutput\\{}'.format(case_name)):
        os.mkdir('C:\\Users\\laura17\\Documents\\ProgrammeOutput\\{}'.format(case_name))
        print '\n{} case file created. All logs will be saved to C:\Users\laura17\Documents\ProgrammeOutput\{}' \
            .format(case_name, case_name)
    else:
        print '\n**Case already exists. Please choose a different case name.**'
        casefile()
    return case_name

作为一个例子,我在返回函数之前打印出case_name以查看发生了什么:

def casefile():
    print '\n\nPlease enter a case name/reference: '
    case_name = raw_input()
    if not os.path.exists('C:\\Users\\laura17\\Documents\\ProgrammeOutput\\{}'.format(case_name)):
        os.mkdir('C:\\Users\\laura17\\Documents\\ProgrammeOutput\\{}'.format(case_name))
        print '\n{} case file created. All logs will be saved to C:\Users\laura17\Documents\ProgrammeOutput\{}' \
            .format(case_name, case_name)
    else:
        print '\n**Case already exists. Please choose a different case name.**'
        casefile()
    print case_name
    return case_name

这是输出: Output with print case_name

非常感谢任何帮助。谢谢。

3 个答案:

答案 0 :(得分:1)

<强> 问题

当您以递归方式调用函数时,您不会从先前调用的函数返回。

当您第一次调用casefile并输入现有名称(即Case1)时,会在堆栈中为其创建一个条目。让我们称之为casefile {1}。在else语句的第casefile()行,该函数将被递归调用。

现在,由于这个递归调用,在堆栈中创建了该函数的另一个条目。让我们调用这个casefile {2}。现在受控制将传递给此函数,但请注意casefile {1}尚未运行 - 您尚未从中返回。

所以现在控件位于casefile {2}。这次您输入一个不存在的名称,即Case2。 casefile {2}不会转到else分支,因此不会再进行递归调用。所以它不会像你要求的那样打印出名称(在casefile {2}的范围内恰好是 Case2 ,并返回名称。

但是现在控件返回到casefile {1},它现在将退出else语句并运行下一行:print case_name,对于casefile {1}的范围恰好是 < EM>案例1 即可。所以它打印并返回。

<强> 解决方案

你应该在递归调用函数后返回。 请将代码更改为:

def casefile():
    print '\n\nPlease enter a case name/reference: '
    case_name = raw_input()
    if not os.path.exists('C:\\Users\\laura17\\Documents\\ProgrammeOutput\\{}'.format(case_name)):
        os.mkdir('C:\\Users\\laura17\\Documents\\ProgrammeOutput\\{}'.format(case_name))
        print '\n{} case file created. All logs will be saved to C:\Users\laura17\Documents\ProgrammeOutput\{}' \
            .format(case_name, case_name)
    else:
        print '\n**Case already exists. Please choose a different case name.**'
        return casefile()
    print case_name
    return case_name

请注意,我已将else语句中的行casefile()更改为return casefile()

这只会打印/返回通过递归调用的函数传递给它的名称。

希望这会有所帮助。干杯!

答案 1 :(得分:0)

您的代码进入递归,因此它返回两个名称。下面的代码首先尝试使用给定的名称创建目录,如果它不能,它将要求另一个输入,直到它能够创建一个。最后,它返回创建的目录的名称。对于python 2,请使用raw_input()和python 3,输入()。

希望这有帮助!

<v-list-tile v-else @click="" :to="{name: '{{item.componentName}}'}" :key="item.text">
            <v-list-tile-action>
              <v-icon>{{ item.icon }}</v-icon>
            </v-list-tile-action>
            <v-list-tile-content>
              <v-list-tile-title>
                {{ item.text }}
              </v-list-tile-title>
            </v-list-tile-content>
          </v-list-tile>

Open this to see output of my terminal

答案 2 :(得分:-1)

使用os.makedirs创建目录,使用try except来捕获任何错误。

In [11]: import os

In [12]: try:
    ...:     os.makedirs('/Users/abc/projects')
    ...: except OSError:
    ...:     print('Already exists')
    ...: else:
    ...:     print('Directory created')
    ...:
Already exists