首先,我是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
非常感谢任何帮助。谢谢。
答案 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>
答案 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