Python自动化办公
今儿有个集美找我,她之前在上海做金融量化分析。后来~“告老还乡”,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