今兒有個集美找我,她之前在上海做金融量化分析。后來~“告老還鄉”,emmm..開玩笑嘿,她家里希望她回家考公務員,So,已經放下 Python 好多年。
於是乎,就有了工作上的“瑣事”(如下圖)。如果她用CV大法去做的話,是非常浪費時間的,所以她就想到了我..那我拍拍大腿,下定決心要秀一下我大Python的強大~HHH,又想着估計很多朋友可能有跟她一樣的困惑,索性就寫篇文章跟大家再分享分享自動化辦公這塊兒,希望對大家有所幫助的啦,奧耶!
一起學習叭
釋放雙手吊炸天案例1
需求:
獲取文件夾里所有文件的名字
將文件名字保存到 docx 文件中
實現:
我們需要獲取某文件夾里邊所有文件的名字,那文件夾實際上是在我們的操作系統中的,所以我們可以使用 python 對接操作系統的模塊來實現——os模塊。需要注意的是,你千萬別給我 pip install os 去安裝,我揍你!這是我們 python 的內置模塊,直接導入就可以使用了,曉得不~
import os
然后使用 os.listdir(path=None) 方法去列出 path 下所有文件的名字,返回值為列表
# 獲取當前 py 文件 所在文件夾cur_dir = os.getcwd()# 列出 cur_dir 下的所有文件名稱cur_file_list = os.listdir(cur_dir)cur_file_list-----------------------------------------['.ipynb_checkpoints','auto_work.ipynb', 'demo.docx', 'demo.txt', 'Untitled.ipynb', '水果店營業額.xlsx']
將這些文件名稱都寫入到 docx 文件中,所以給大家介紹 python-docx 這個模塊,它是需要安裝的喲!pip install python-docx 進行安裝,然后可參考官網:https://python-docx.readthedocs.io/en/latest/index.html
# 從 docx 模塊中 導入 Document 類from docx import Document# 創建 doc 對象document = Document()# 添加 1級 標題document.add_heading('工作文件夾清單', 0)# 將 cur_file_list 中每個元素,寫入到 docx 文檔中的段落for cur_file in cur_file_list:document.add_paragraph(cur_file)# 保存 docx 文件document.save('清單.docx')
效果如下:
釋放雙手吊炸天案例2
在 dos 命令行運行 py 文件傳入參數 path1 path2
將 path2 下的所有文件根據其擴展名,分類至 path1 下的文件夾中(該文件夾以擴展名命名分類)...阿我感覺我描述不清了~直接上圖看效果叭!
獲取在命令行運行文件傳入的參數。這一塊我們需要使用到 python 的內置模塊 sys 模塊,該模塊是與 python 解釋器進行交互滴~ 其中的 sys.argv 就可以達到我們的目的,但是注意它的返回值為列表,並且列表中第一個元素為當前文件的名稱,其它元素為運行文件所傳入的參數。
import osprint(sys.argv)--------------------------------E:\highCode>python test.py "C:\Users\lenovo\Desktop\Demo\category" "C:\Users\lenovo\Desktop\Demo"['test.py', 'C:\\Users\\lenovo\\Desktop\\Demo\\category', 'C:\\Users\\lenovo\\Desktop\\Demo']
當分類文件夾不存在時,則創建文件夾。使用 os.mkdir(path) 方法,注意:該方法使用時,若重復創建則會拋出異常,所以我們先通過 os.path.exists(path) 進行判斷該文件路徑是否存在,不存在時才創建。
import sys# 分類文件夾cate_dir = sys.argv[1]# 需要被分類文件的文件夾goal_dir = sys.argv[2]# 創建文件夾if not os.path.exists(cate_dir):os.mkdir(cate_dir)
獲取 goal_dir 文件夾下的所有文件以及子文件夾下的所有文件的絕對路徑。我們需要使用 glob 模塊,它有一個非常棒的優勢,就是可以使用 Unix shell 風格的通配符匹配符合特定格式的文件和文件夾。來看看它的官方說明
Signature: glob.glob(pathname, *, recursive=False)Source: def glob(pathname, *, recursive=False):"""Return a list of paths matching a pathname pattern. The pattern may contain simple shell-style wildcards a la fnmatch. However, unlike fnmatch, filenames starting with a dot are special cases that are not matched by '*' and '?' patterns. If recursive is true, the pattern '**' will match any files and zero or more directories and subdirectories. """ return list(iglob(pathname, recursive=recursive))
注意:當我們設置 recursive 為 true 的時候,**才意味着匹配到文件夾下子文件夾的文件...
import glob# 循環遍歷 goal_dir 下的 所有 文件for file in glob.glob(f"{goal_dir}/**/*", recursive=True):print(file)----------------------------------------------------------C:/Users/lenovo/Desktop/Demo\auto_work.ipynbC:/Users/lenovo/Desktop/Demo\demo.docxC:/Users/lenovo/Desktop/Demo\demo.txtC:/Users/lenovo/Desktop/Demo\Untitled.ipynbC:/Users/lenovo/Desktop/Demo\新建文件夾C:/Users/lenovo/Desktop/Demo\清單.docxC:/Users/lenovo/Desktop/Demo\老Amy水果店營業額.xlsx
並且我們發現,file 包括了文件夾的絕對路徑~ 我們只需要文件的名稱就夠了。通過 os.path.isfile(file) 來過濾出文件的絕對路徑,然后通過 os.path.basename(file) 取出文件名,比如:demo.txt
獲取其文件名的擴展名(txt),去創建 category 下的文件夾 txt
import shutil# 但是 遍歷確認是文件 則需要獲取到 絕對路徑的 文件名for file in glob.glob(f"{goal_dir}/**/*", recursive=True):if os.path.isfile(file): # 獲取絕對路徑中的文件名 如:demo.txt filename = os.path.basename(file) # 如果.在文件名中 取出其擴展名 if "." in filename: suffix = filename.split(".")[-1] # 創建cate_dir 下的 擴展名 文件夾 if not os.path.exists(f"{cate_dir}/{suffix}"): os.mkdir(f"{cate_dir}/{suffix}") # 將文件 拷貝到 f"{cate_dir}/{suffix}" 下 shutil.copy(file, f"{cate_dir}/{suffix}")鄭州人流醫院哪家好http://www.zztjyiyuan.com/
咚咚咚~這樣就能實現效果,后面這個案例借鑒其它的啦。實在是不會體會到你們要使用 excel 的痛苦的...hhhh