最近在實(shí)際工作中遇到一個(gè)需求,需要檢測一個(gè)大文件夾下所有文件的更新狀態(tài),這個(gè)大文件夾下面包含了很多文件和文件夾,文件夾中又包含了很多文件和文件夾...... 類似下面這張圖片。
看到這么多層的包含嵌套關(guān)系,我們首先想到的可能是使用for循環(huán),但是在這個(gè)需求中,for循環(huán)不能滿足我們的要求,原因有兩個(gè):
- 1、我不能確定文件夾中到底嵌套了多少層
- 2、使用for循環(huán)為增加代碼量并且不好維護(hù)
由于這些痛點(diǎn),我們選擇使用遞歸算法來實(shí)現(xiàn)。 遞歸算法,通俗的解釋是后一步需要依據(jù)前一步的結(jié)果來進(jìn)行,所以我們可以定義一個(gè)函數(shù),在滿足條件的是的在函數(shù)內(nèi)部調(diào)用這個(gè)函數(shù): 我們先來看Python代碼:
file_list = [] def get_file_url(session, next_url): next_response = session.get('https://gitlab.com' + next_url) soup = BeautifulSoup(next_response.text, 'html.parser') folders = soup.find_all('tr', class_=re.compile("^tree-item file_")) for folder in folders: folder_name = folder.find('td').find('a').attrs['title'] folder_url = folder.find('td').find('a').attrs['href'] if len(folder_name.split('.')) > 1: file_list.Append(folder_url) else: get_file_url(session, folder_url)
邏輯其實(shí)很簡單,我們首先判斷一下,如果這個(gè)文件含有后綴,我們就判斷它是個(gè)文件,否則就判斷它是一個(gè)文件夾。當(dāng)判斷是文件夾的時(shí)候,就接著調(diào)用這個(gè)函數(shù),直到文件中包含文件,不包含文件夾,本次遞歸停止。
很多人學(xué)了很多算法之后不知道怎么用,這就是一個(gè)很好的例子,只不過我是在網(wǎng)頁上遞歸尋找文件,你也可以自己在本地試一試。