读取压缩包
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)删除掉原始文件
根文件夹如下图:
在‘打卡’文件中,有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个月,所以不满足筛选的条件)