前言
最近有些剛入門Python的小伙伴問我,他已經學會了大部分語法,基本的列表,元組也會使用,但是在實際中需要做一點小需求的時候,仍然不知所措。
解決問題重要的并非是如何寫代碼,而是如何分析和拆解問題,因此編程的思路變得非常重要。
本文以一個小需求為例子,講解從分析思路,到編寫代碼,整個流程的細節,希望能讓你得到更快速的水平提升。
本文重點
分析問題的思路。實現細節的關鍵點。需求變動時的應對。

需求
我們從這樣的一個小需求開始:某個文件夾中存在一系列電視劇的視頻文件,目的是把這些文件名字按規則轉成其他的形式。
如下圖,左邊為原始文件名,右邊是修改后的文件名:

別沖動,分析一下問題,能更高效解決問題
初學者很容易犯的一個錯誤是,遇到一個需求,沒有進行分析直接就寫代碼。嘗試一鼓作氣地完成。但往往會出現以下問題:
無法連貫編寫代碼,編寫過程總是會遇到小問題。寫出來一大片代碼,完全沒有重點,自己看過去似乎也看不太懂。就像一篇沒有分段,大雜燴的文章一樣。一旦需要修改某些地方,就會出現莫名其妙的錯誤,也很難查出問題原因。別怕,下面我們就一起來看看如何分析問題。
拆解
想想需求的描述,首先需要一個"從文件夾中找出視頻文件名字"這樣的功能。
函數名字 get_file_names ,其中函數名字體現了函數返回的是文件名字的序列。我們需要告訴他是從哪個文件夾中尋找文件,因此有一個參數 folder 。注意,這個函數返回的文件名是不包含后綴名。不要急著去實現他,先寫個 pass ,后續再回頭來實現即可。
下一個功能是"把一個文件名字轉成其他形式的新名字"。
函數名字 get_new_name 。需要傳入一個文件名字讓函數處理。返回的就是結果的文件名。注意,這個函數只是負責處理單個的文件名字。最后,需要一個負責修改文件名的函數即可。如下:

folder 參數是文件所在目錄路徑。org_name 參數是原文件名字。new_name 參數是新文件名字。注意,原名字和新名字都不包括后綴。

想想目前是否可以解決問題
這時候只需要想一下,是否可以利用目前的自定義函數即可解決問題。
先調用 get_file_names 獲得一系列的文件名。把文件名逐一傳給 get_new_name ,即可得到修改后的文件名。最后把原名字和新名字傳入 rename ,即完成需求。看起來沒問題了。現在就可以回頭實現剛剛定義的函數了。
實現
另外小編整理了一套Python的學習資料需要的按以下步驟可獲得!
1、評論
2、轉發
3、關注
4、后臺私信【python】即可獲取!

在每個函數中編寫代碼時,因為問題足夠小,能讓我們可以保持注意力,不會被其他問題所影響。行13,通過 pathlib.Path 的方法 glob ,即可得到目錄下所有的視頻文件,這里只取出 mp4 文件。行14,因為在定義這個函數時就已經明確返回的內容不包括后綴名,這里是只取文件的名字。通過 stem 屬性實現。行17,簡單通過分列把名字分割成劇名與數字2個部分。行18,按規則并接成結果即可。行21-行23,這里生成修改名字需要的原始文件的全路徑和新文件的全路徑。更多的好處
現在,我們不僅順利把小問題解決了,還可以單獨對這些小函數進行測試。如下圖:

最后一個紅框部分,我們發現特殊情況下會導致 get_new_name 函數出現報錯。我們已經把各個小問題獨立開來,因此解決問題就變得很容易。這個報錯顯然是因為名字中多了一個橫杠,那么我們只需要改善 get_new_name 即可。串聯起來即可解決問題

這里我們只需要簡單組合之前實現的幾個函數即可。改進
當前雖然已經可以實現出功能,但畢竟是修改文件名字也是一個重要操作,因此希望加入以下改進:
程序執行時,先列出操作的詳細信息(文件變化前后的名字等)需要用戶輸入Y后,才真正執行修改動作。由于我們之前已經把每個核心環節拆分成獨立的函數,因此面對這種變動就變得很容易。如下:

定義一個函數 display_message ,負責顯示信息。參數 modify_msgs 是一個列表,其中的元素是元組(原始文件,新文件)。下圖是主流程實現:

行63-行66,得到一個原始文件對應新文件的信息列表。行68,則是顯示信息。行69-行72,則是讓用戶確認執行。小結
把問題拆解成小問題。定義小函數逐個擊破每個小問題。最后按照流程組合每個小函數,即可解決問題。如果覺得本文對你有所幫助,記得關注、評論、轉發、收藏噢~