簡體   English   中英

如何檢查目錄是否存在,然后檢查是否在Python中提供了新的目錄名稱?

[英]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

這是輸出: 輸出帶有print 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM