[英]How do I check if a directory exists and then, if so, ask for a new directory name in 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
例如,我在return函數之前打印出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
任何幫助將非常感激。 謝謝。
問題
遞歸調用函數時,您不會從先前調用的函數中返回。
發生的情況是,當您第一次調用casefile並輸入現有名稱(即Case1
,會在堆棧中為其創建一個條目。 讓我們將其稱為casefile {1}。 在else語句的casefile()
中,將以遞歸方式調用該函數。
現在,由於此遞歸調用,在堆棧中創建了該函數的另一個條目。 讓我們將此案例文件稱為{2}。 現在,受控對象將傳遞給該函數,但請注意casefile {1}尚未運行-您尚未從中返回。
因此,現在控件位於casefile {2}。 這次,您輸入一個不存在的名稱,即Case2
。 casefile {2}不會轉到else分支,因此不會再進行遞歸調用。 因此,它不會像您要求的那樣打印名稱(在casefile {2}范圍內恰好是Case2 ,並返回名稱。
但是現在控件返回到casefile {1},它將退出else語句並運行下一行: print case_name
,在casefile {1}范圍內恰好是Case1 。 因此它將打印並返回。
解
您應該在遞歸調用函數后返回。 請更改代碼為:
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()
。
這只會打印/返回通過其遞歸調用函數傳遞給它的名稱。
希望這可以幫助。 干杯!
您的代碼將進行遞歸,因此它返回兩個名稱。 以下代碼首先嘗試使用給定名稱創建目錄,如果無法創建目錄,則它將要求其他輸入,直到它能夠創建一個為止。 最后,它返回所創建目錄的名稱。 對於python 2,請使用raw_input();對於python 3,請使用input()。
希望這可以幫助!
import os
def casefile(path):
while(True):
try :
# raw_input() for python 2
case_name = input("Enter the case: ") # for python 3
os.makedirs(path+case_name)
return (case_name)
except:
pass
使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.