背景
今儿有个集美找我,她之前在上海做金融量化分析。后来~“告老还乡”,emmm..开玩笑嘿,她家里希望她回家考公务员,So,已经放下 Python 好多年。
于是乎,就有了工作上的“琐事”(如下图)。如果她用CV大法去做的话,是非常浪费时间的,所以她就想到了我..那我拍拍大腿,下定决心要秀一下我大Python的强大~HHH,又想着估计很多朋友可能有跟她一样的困惑,索性就写篇文章跟大家再分享分享自动化办公这块儿,希望对大家有所帮助的啦,奥耶!
实战
案例一
需求
- 获取文件夹里所有文件的名字
- 将文件名字保存到 docx 文件中
实现 我们需要获取某文件夹里边所有文件的名字,那文件夹实际上是在我们的操作系统中的,所以我们可以使用 python 对接操作系统的模块来实现——os模块。需要注意的是,你千万别给我 pip install os 去安装,我揍你!这是我们 python 的内置模块,直接导入就可以使用了,晓得不~
import os # 直接使用
然后使用 os.listdir(path=None) 方法去列出 path 下所有文件的名字,返回值为列表
# 从 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')
效果如下:
案例二
需求
- 在 dos 命令行运行 py 文件传入参数 path1 path2
- 将 path2 下的所有文件根据其扩展名,分类至 path1 下的文件夹中(该文件夹以扩展名命名分类)...阿我感觉我描述不清了~直接上图看效果叭!
实现 获取在命令行运行文件传入的参数。这一块我们需要使用到 python 的内置模块 sys 模块,该模块是与 python 解释器进行交互滴~ 其中的 sys.argv 就可以达到我们的目的,但是注意它的返回值为列表,并且列表中第一个元素为当前文件的名称,其它元素为运行文件所传入的参数。
import os
print(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.ipynb
C:/Users/lenovo/Desktop/Demo\demo.docx
C:/Users/lenovo/Desktop/Demo\demo.txt
C:/Users/lenovo/Desktop/Demo\Untitled.ipynb
C:/Users/lenovo/Desktop/Demo\新建文件夹
C:/Users/lenovo/Desktop/Demo\清单.docx
C:/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}")
~这样就能实现效果.很感谢大家能够看到这儿!有关于自动化办公还需要了解哪些技术可以评论告诉我