目录
ps:前四篇针对文件(夹)、压缩包操作进行了学习,这篇主要利用前期的知识点结合实际办公中需要解决的一些问题进行实战分析,也是对阶段学习的一次复习和巩固,如有不足,希望大家在评论指出分享,或者聊聊在办公中有哪些繁琐而又重复的工作,我们可以尝试用Python进行解决,将我们的效率大大提高。
0.引用
整篇为一个py文件,分多个功能函数,可单独或组合使用,共调用模块如下:
import os, fnmatch, arrow, shutil, time, datetime, zipfile
1.目录
1.1 创建备份目录
# 创建备份目录
def Make_Back_Dir(path):
if not os.path.exists(path):
os.mkdir(path)
该执行在主函数上,便于其他函数使用备份path
1.2.遍历查询目录(优化)
知识点:[Python自动化办公]02遍历、搜索文件及查询文件信息
# 遍历查询目录
def Diposs_Of_File(path):
select = input("是否只查询当前目录(y/n):")
file_list = []
for dirpath, dirnames, files in os.walk(path):
for file in files:
file_list.append(os.path.join(dirpath, file))
# 查询当前目录
if select == 'y' and dirpath == path:
break
return file_list
在主函数中执行,获取返回的files列表
2.文件
2.1 筛选文件类型(优化)
知识点:[Python自动化办公]02遍历、搜索文件及查询文件信息
# 筛选文件类型
file_type = ['*','docx','xlsx','pptx','jpg','png','psd','mov','mp4']
def Screen_File_Type(files):
type_dist = {value:file_type[value] for value in range(len(file_type))}
# print(type_dist)
value = input("筛选文件类型:{}".format(type_dist))
if not value == '':
new_files = [file for file in files if fnmatch.fnmatch(file, '*.'+type_dist[value])]
return new_files
else:
return files
在主函数中调用函数,输入files列表,返回筛选后files列表
2.2 筛选文件大小(优化)
# 筛选文件大小
def Screen_File_Size(files):
compare_type = {'1': '大于', '2': '小于', '3': '范围'}
select_compare = input("筛选文件大小:{}".format(compare_type))
size_type = {'b':'1', 'kb':'1024', 'mb':'1024*1024', 'gb':'1024*1024*1024'}
select_size = input("{}".format(size_type.values()))
if compare_type[select_compare] == '大于':
min = input("min:")
files_size = [file for file in files if os.stat(file).st_size > int(min) * int(size_type[select_size])]
elif compare_type[select_compare] == '小于':
max = input('max:')
files_size = [file for file in files if os.stat(file).st_size < int(max) * int(size_type[select_size])]
else:
min = input("min:")
max = input('max:')
files_size = [file for file in files if int(min) * int(size_type[select_size]) < os.stat(file).st_size < int(max) * int(size_type[select_size])]
return files_size
在主函数中调用函数,输入files列表,返回筛选后files_size列表
2.3 筛选文件时间(优化)
# 筛选文件时间
def Screen_File_Time(files):
time_type = {'1':'years', '2':'months', '3':'days', '4':'日期'}
select = input("筛选文件时间:{}".format(time_type))
time = input("输入时间:")
if time_type[select] == 'years':
screen = arrow.now().shift(years=-int(time))
elif time_type[select] == 'months':
screen = arrow.now().shift(months=-int(time))
elif time_type[select] == 'days':
screen = arrow.now().shift(days=-int(time))
elif time_type[select] == '日期':
screen = arrow.get(time, 'YYYY-MM-DD')
else:
screen = arrow.now()
files_time = [file for file in files if os.stat(file).st_mtime < screen.timestamp]
return files_time
在主函数中调用执行函数,输入files列表,返回筛选后files_time列表
注意:在此,加入了新模块arrow,用于时间增减计算的模块,解决上一章时间处理上的瑕疵
2.4 文件分类归档(优化)
# 文件分类归档
def File_Sort_Merge(path, files):
select = input("是否需要进行分类归档(y/n):")
if select == 'y':
i = 1 # 计数
for file in files:
dir_path = os.path.join(path, file.split('.')[1])
Make_Back_Dir(dir_path)
file_type = os.path.split(file)[1]
file_time = time.localtime(os.stat(file).st_mtime)
new_name = time.strftime("%Y-%m-%d-{}".format(i), file_time)+file_type
shutil.move(file, dir_path+'\\'+ new_name)
print('{}份文件分类完成!'.format(i))
该函数输入备份path和files列表,即可按文件后缀进行分类,并跟根据文件最后修改时间进行重命名
2.5 清除过期文件(优化)
# 清除过期文件
def Del_Expire_File(files):
for file in files:
select = input("是否对{}进行删除(y/n)".format(file))
if select == 'y':
os.remove(file)
with open(str(datetime.date.today()) + '_remove_log.txt', 'a', encoding='utf-8') as f:
f.write('{time}移除文件:{name}'.format(time=datetime.datetime.now().time(), name=file))
print('清理完成!')
调用执行函数,输入过期files列表,每次清除前均进行确认,防止操作失误
3.解压缩
3.1 解压文件整理(优化)
# 解压文件整理
def Unzip_File_Sort(path, zfile):
if zipfile.is_zipfile(zfile):
files = []
with zipfile.ZipFile(zfile, 'r') as zipobj:
for file in zipobj.namelist():
zipobj.extract(file)
os.rename(file, file.encode('cp437').decode('gbk'))
files.append(file.encode('cp437').decode('gbk'))
print('解压完毕!')
# 整理归档调用函数
File_Sort_Merge(path, files)
该函数还调用了文件分档归类函数,在文件解压后进行分类,输入解压path和file
注意:调用时如有多个压缩包,需使用for循环进行
3.2 备份压缩存档(优化)
# 备份压缩存档
def Backup_Zip_Keep(path, files):
with zipfile.ZipFile(os.path.join(path, str(datetime.date.today())+'.zip'), 'a') as zipobj:
for file in files:
zipobj.write(file)
调用该函数,需要输入file,如是files时使用for循环调用,同时输入备份path,按日期在备份目录创建压缩包命名
4.功能综合
主函数,调用上述所有文件处理的函数,在实际运用中,选择需要进行组合,直接运行所有函数,将出现错误(文件清理执行后,files列表为空)
if __name__ == '__main__':
# 创建备份目录
back_path = input("输入备份路径:")
Make_Back_Dir(back_path)
# 遍历查询目录
diposs_of_path = input("输入查询路径:")
files = Diposs_Of_File(diposs_of_path)
# 任意组合选择,去注释即可用
# 执行筛选文件类型
# files = Screen_File_Type(files)
# 执行筛选文件大小
# files = Screen_File_Size(files)
# 执行筛选文件时间
# files = Screen_File_Time(files)
# 执行文件分类归档
# File_Sort_Merge(files)
# 执行清理过期文件
# Del_Expire_File(files)
# 解压文件整理
# zfile = input('解压文件路径:')
# Unzip_File_Sort(back_path, zfile)
# 备份压缩存档
# Backup_Zip_Keep(back_path, files)
PS:代码均基于Python3.7环境下运行检验,如有不足欢迎评论交流。(优化1次4.23)
说明:对于时间模块time、datetime、arrow正在进行梳理,下步将单开交流