手把手教你学python基础课系列快速回顾:
1、“零基础包学会” 手把手教你学python一:如何快速找到学习资源?
2、手把手教你学python第二课:如何迅速上手马上能run
3、手把手教你学python第三课:数据分析,学会使用pandas大杀器
5、手把手教你学python第五课:各种渠道获取数据,快速学会windpy和网络爬虫
6、手把手教你学python第六课:技术分析入门-talib
手把手教你学python第六课:技术分析入门-talib-成交量及曲线形态
手把手教你学python第六课:技术分析入门-talib-安装及动量指标
手把手教你学python进阶系列快速回顾:
2023
手把手教你学python系列进阶版
写在最初
在新的一年与尔岩说将继续之前的手把手教你学python专栏(停更的原因一部分是因为大家说之前的需要时间消化,所以停了一段时间,另一部分原因是想邀请比我更专业而且实用性更强的王者们来上进阶课程),主笔加入了我的两个非常好的两个朋友(笔名十月和木矛木心),下面是十月写在最初的话:
这里会定期更新一些实际案例和具体用法,如果你和我一样热爱用科技提高工作效率,并想要一起研究一些有意思的事情,欢迎一起来进阶!!
文件目录操作是在日常高频使用的代码,但通常只占据极小的代码量,熟悉常用的一些模块和函数即可覆盖绝大多数使用场景。本案例以清理PC微信缓存文件为例,简要讲解os、re、datetime三个模块的常用方法,以及python常用语法。(蓬蓬说:这部分其实非常重要,不仅在平时完成一些自动化的模块当中用的很多,实用性很强,而且学好了真的是生产力提升大杀器,一行代码实现菜鸟几十行实现不了的功能~~十月还是用了日常中需求很多的例子来教学的,亲自尝试一定有收获!!)
因为PC微信缓存文件的特殊方式,经常会发现同样一份文件,存在N个一模一样的副本,日积月累下吃掉了大量硬盘空间。微信客户端提供了一些工具,能够一定程度帮助我们清理缓存文件,但难以实现较复杂的需求,比如:只清理重复冗余文件、只清理PDF文件、只清理文件名中含有关键字的文件等。
首先,我们在VSCode中新建一个jupyter notebook。并导入本案例中需要用到的模块。
import os
import re
import datetime
# 查找冗余文件需要用到hash算法模块
# https://docs.python.org/3/library/hashlib.html
import hashlib
然后,我们从微信设置界面中,点击打开文件夹,记录下自己微信账号的缓存文件保存位置,并在Python中设置为常量。
# 文件路径字符串的斜杠“\”在Python中为转义字符,在字符串前加“r”标记,取消字符串转义
# 微信缓存文件路径,在默认保存位置的“FileStorage\File”目录下
# Python字符串拼接有多种方法,拼接文件路径时,可以用os.path.join,便于及时发现路径是否设置正确
PATH_WECHAT_CACHE = r"替换为微信缓存文件目录"
PATH_WECHAT_CACHE_FILE = os.path.join(PATH_WECHAT_CACHE, r"FileStorage\File")
# 利用os模块检查路径设置是否正确
# os.path.exists用于检查所输入路径是否存在
# os.path.isdir用于检查所输入路径是否为文件目录
if not (os.path.exists(PATH_WECHAT_CACHE_FILE) and os.path.isdir(PATH_WECHAT_CACHE_FILE)):
raise Exception("微信缓存目录设置错误")
微信缓存文件是按月份分别保存,我们可以利用正则表达式来识别文件夹的年份、月份信息,并转换为Python中的日期格式,为进一步执行过期文件夹清理做准备。正则表达式的语法规则可参考微软出品的参考文档。
https://learn.microsoft.com/zh-cn/dotnet/standard/base-types/regular-expression-language-quick-reference
# 声明一个列表,用于存放整理后的日期数据
list_cache_file_months = list()
# 声明一个日期阈值变量,用于筛选过期文件夹
threshold_dir_outdated = datetime.date(2023, 1, 1)
# 利用os.listdir列出所有缓存文件夹
# 利用正则表达式"^(\d{4])-(\d{2})$"识别文件夹名代表的年份、月份信息
# 利用datetime.date将年份、月份转换为Python中的日期格式
for loop_date in os.listdir(PATH_WECHAT_CACHE_FILE):
loop_year, loop_month = re.findall("^(\d{4])-(\d{2})$", loop_date)[0]
list_cache_file_months.append(datetime.date(int(loop_year), int(loop_month), 1))
# 利用列表推导式筛选过期的文件夹,便于执行清理任务
list_cache_file_months_outdated = [d for d in list_cache_file_months if d < threshold_dir_outdated]
上述清理过期文件夹的方式较为粗糙,只是简单筛选过期的文件夹。如果需要更精细化的清理方式,我们将会用到更丰富的函数。例如,假设需要清理2023年1月1日10点前的所有pdf文件。
首先,我们可以按如下代码来获取全部pdf文件的完整路径信息。
# 声明一个列表,用于存放所有pdf文件的路径
list_cache_file_pdfs = list()
# 利用os.walk遍历所有文件夹和子文件夹, 函数每次迭代返回一个元组,包含当前文件夹路径、所有子文件夹名、所有文件名
# 利用os.path.splitext获取文件扩展名,并判断是否为pdf文件
# 利用os.path.join拼接pdf文件的完整路径
for loop_dir in os.walk(PATH_WECHAT_CACHE_FILE):
for loop_file in loop_dir[2]:
if os.path.splitext(loop_file)[1].lower() == '.pdf':
list_cache_file_pdfs.append(os.path.join(loop_dir[0], loop_file))
然后,即可通过获取pdf文件的修改日期时间,判断文件是否过期,为进一步清理做好准备。
# 声明一个列表,用于存放所有过期pdf文件的路径
list_cache_file_pdfs_outdated = list()
# 声明一个日期时间阈值变量,用于筛选过期pdf文件
threshold_pdf_outdated = datetime.datetime(2023,1,1,10)
# 利用os.path.getmtime获取pdf文件的修改日期时间,返回值为timestamp格式
# 利用datetime.datetime.fromtimestamp将获取到的文件日期时间转换为Python中的日期时间格式
for loop_pdf in list_cache_file_pdfs:
if datetime.datetime.fromtimestamp(os.path.getmtime(loop_pdf)) < threshold_pdf_outdated:
list_cache_file_pdfs_outdated.append(loop_pdf)
若需要清理重复的pdf文件,则需要用到hashlib模块中的哈希算法,实现对重复文件的判断;本案例中使用了其中的MD5算法。
# 定义一个函数用于获取文件的MD5
# 函数输入参数和输出结果可用类型标注语法,增加函数可读性
# https://docs.python.org/3/library/typing.html
# 利用hashlib.md5计算文件的MD5值
def get_file_md5(file_path:str, buffer_size:int = 8096) -> str:
with open(file_path, 'rb') as f:
file_md5 = hashlib.md5()
while True:
s = f.read(buffer_size)
if not s:
break
file_md5.update(s)
return file_md5.hexdigest()
# 声明一个列表,用于存放所有重复冗余pdf文件的路径
list_cache_file_pdfs_duplicated = list()
# 声明一个集合,用于存放所有pdf文件的MD5值
set_cache_file_pdfs_md5 = set()
# 利用定义的get_file_md5函数获取所有pdf文件的MD5值
# 判断pdf文件的MD5值是否已经存在,若已存在则判定为重复冗余文件
for loop_pdf in list_cache_file_pdfs:
loop_pdf_md5 = get_file_md5(loop_pdf)
if loop_pdf_md5 in set_cache_file_pdfs_md5:
list_cache_file_pdfs_duplicated.append(loop_pdf)
else:
set_cache_file_pdfs_md5.add(loop_pdf_md5)
上述代码用于确定需要清理的文件或文件夹范围,实际的清理删除需要用到os模块。以清理重复的pdf文件为例。
# 利用os.remove执行文件删除操作,请谨慎使用
for loop_pdf_duplicated in list_cache_file_pdfs_duplicated:
os.remove(loop_pdf_duplicated)
本次案例以清理PC微信缓存文件为例,主要展示了os模块中与文件目录操作有关的常见函数和用法,以及re、datetime模块的初步使用,同时包含了Python常用语法的示例。若有错漏之处,还请各位批评指正。
——文 by 十月