【python办公自动化(5)】创建和解压压缩包--根据修改日期清理文件

读取压缩包

zipfile模块 zipobj.namelist()

import os
os.chdir('D:/python_major/auto_office5/')
import zipfile

with zipfile.ZipFile('这是一个压缩包.zip','r') as zipobj:
    print(zipobj.namelist())

输出结果:[‘╒Γ╩╟╓╪├ⁿ├√╡─╬─╝■╝╨/’, ‘lesson1.py’, ‘lesson2.py’, ‘new.txt’, ‘file3.txt’]

有中文命名的文件夹在输出结果时会出现乱码的问题,建议在创建文件的时候尽量采用英文的方式进行命名,该类问题的解决如下:

import zipfile

with zipfile.ZipFile('这是一个压缩包.zip','r') as zipobj:
    with zipfile.ZipFile('这是一个压缩包.zip','r') as zipobj:
    for file_name in zipobj.namelist():
        print(file_name.encode('cp437').decode('gbk'))

输出结果:这是重命名的文件夹/
lesson1.py
lesson2.py
new.txt
file3.txt

当文件名称出现中文时候时候,需要调整一下编码即可

压缩包内信息获取 zipobj.getinfo()

import zipfile

with zipfile.ZipFile('这是一个压缩包.zip','r') as zipobj:
    for file_name in zipobj.namelist():
        info = zipobj.getinfo(file_name)
        file_name = file_name.encode('cp437').decode('gbk')
        print(file_name, info.file_size, info.compress_size)

输出结果: 文件名称、文件大小、压缩后的大小(单位是字节)

将压缩包内单个文件解压出来 zipobj.extract()

zipobj.extract(压缩包内要解压的文件名,解压到哪个位置)

import zipfile

with zipfile.ZipFile('这是一个压缩包.zip','r') as zipobj:
    zipobj.extract('file1.txt')

如果不添加解压的路径,默认的是解压到与’这是一个压缩包.zip’文件路径相同的地方,当然也存在中文乱码的问题,需要重新调整编码,如果不调整就解压的也是乱码的文件

import zipfile

for file_name in zipobj.namelist():
    correct_path = file_name.encode('cp437').decode('gbk'))

再次建议路径文件或者文件夹命名时候不要出现中文,如果有中文的话要先获取正确的编码文字,再重命名

将所有的文件都提取出来 zipobj.extractall()

zipobj.extractall(path=解压到的位置)

import zipfile

with zipfile.ZipFile('这是一个压缩包.zip','r') as zipobj:
    zipobj.extractall(path = './解压到这里')

将有密码的压缩包解压

zipobj.extractall(path=解压到的位置, pwd=b’密码’)

import zipfile

with zipfile.ZipFile('这是一个压缩包.zip','r') as zipobj:
    zipobj.extractall(path = './解压到这里', pwd = b'hello world!')

创建压缩包

zipobj.write()

import zipfile

file_list = [ 'lesson1.py', 'lesson2.py', 'new.txt', 'file3.txt']
with zipfile.ZipFile('这是一个程序创建的压缩包.zip','w') as zipobj:
    for file in file_list:
        zipobj.write(file)

如果没有这个压缩包,直接创建的话使用’w’,如果已经存在了,要向压缩包里面添加内容的时候,将’w’改成’a’即可,否则系统会报错

import zipfile

with zipfile.ZipFile('这是一个程序创建的压缩包.zip','a') as zipobj:
    zipobj.write('file1.txt')

综合应用

编写一个python程序,示例文件夹内容如下,要求:

(1)找出当前目录下所有距离上次修改时间超过三个月的文件

(2)将所有文件重命名,在原文件名的开头加上最后的修改日期

(3)创建一个新文件夹名叫backup

(4)将所有重命名的文件都添加到压缩包里面,给压缩包加上今天的日期

(5)将压缩包移动到backup文件夹里面

(6)删除掉原始文件

根文件夹如下图:
ubmV0L2x5c184Mjg=,size_16,color_FFFFFF,t_70)
在‘打卡’文件中,有8-10月份的打卡记录。
在这里插入图片描述

编写程序参考代码如下:

第一步:导入要使用的库并设置程序运行路径

import os 
import datetime
import shutil
import zipfile

os.chdir('D:\\python_major\\auto_office5_copy')
if not os.path.exists('backup'):
	os.mkdir('backup')

该部分代码实现的功能:相关库的导入、程序路径的设置和backup文件夹的创建

第二步:查找目标文件、重命名并将文件名输出至列表

file_list = []  
for dirpath,dirnames,files in os.walk('./'):
    #print(dirpath)
    for file in os.scandir(dirpath):
        #print(file)
       	changed_tm = datetime.datetime.fromtimestamp(file.stat().st_mtime)
       	today = datetime.datetime.today()
       	today_year = today.year
       	today_month = today.month
       	distance_year = today_year - changed_tm.year
       	distance_month = (distance_year) * 12 + today_month - changed_tm.month
       	#计算相差的月份
       	if distance_month > 3:
       		new_file = str(changed_tm.year)+'-'+str(changed_tm.month)+'-'+str(changed_tm.day)+ '-'+ file.name
       		#print(new_file)
       		os.rename(file, new_file)
       		#重命名后文件会默认转移到os.getced()路径下,也就是最初设置的路径
       		file_list.append(new_file)

该部分代码实现的功能:距离修改时间大于3个月的变量的求解、目标文件的查找并重命名、将重命名后的文件存入列表

第三步:文件写入到压缩包并删除原始文件

with zipfile.ZipFile('综合应用压缩包.zip','w') as zipobj:
    for file in file_list:
        zipobj.write(file)
        os.remove(file) 

该部分代码实现的功能:将列表里存放的文件全部写入到压缩包,之后删除原始(已经被重命名过了)文件

第四步:压缩包重命名并移动到目标文件夹

zip_name = '综合应用压缩包.zip'
today_ymd = str(today.year) + '-' + str(today.month) + '-' + str(today.day)
zip_name_changed =  today_ymd + zip_name 
os.rename(zip_name,zip_name_changed)
shutil.move(zip_name_changed,'./backup/')

该部分代码实现的功能:按照要求修改压缩包的名称,然后将压缩包移动到backup文件夹下面

第五步:检查结果

if os.path.exists('backup/' + zip_name_changed):
	print('压缩包已成功移动到目标文件夹,任务完成.恭喜!')
	print('finished!')

该部分代码实现的功能:判断移动的压缩包是否存在于指定文件夹下,并输出提醒信息

全部程序代码和输出结果

程序代码及运行结果

在这里插入图片描述

文件夹内容查看

(1)指定文件夹下面存在移动过去的压缩包
在这里插入图片描述
(2)压缩包里面的内容查看,'打卡’文件夹里存放着是8-10月的打卡记录文件,压缩包里面按照要求输出的应该只用8-9月的文件数据,而’打卡’文件夹里应该还保留着10月份的打卡记录文件(因为19年10月份距离今日20年1月份只有3个月,不是大于3个月,所以不满足筛选的条件)
压缩包内的数据文件
'打卡'文件夹里的数据文件

建议

在进行调试之前,可以将原来的文件夹复制一份并进行压缩(或者把复制的这一份放在其他的路径,比如桌面),这样做的好处在于,避免在调试过程中程序运行文件夹里的数据会发生变化,调试过程中可能会出现文件被移动、已经被重命名、已经不存在等现象,从而导致程序运行时系统报错。

如果程序出错后可以直接解压备份的压缩包或者将桌面的复制文件移动过来,不会影响文件内程序的执行,避免了每次运行原程序后手动再把文件的名称修改回去的麻烦。

发布了20 篇原创文章 · 获赞 4 · 访问量 1981

猜你喜欢

转载自blog.csdn.net/lys_828/article/details/104039070