读取压缩包
常用压缩格式有zip、rar。zip 包随python安装自带-zipfile,rar需要单独安装包 pip install rarfile。
读取压缩包文件
zipfile.ZipFile(‘压缩包名称’,‘r’) rarfile.RarFile(‘压缩包名称’,‘r’) namelist()
‘r’ 读取
zip压缩包
import zipfile
with zipfile.ZipFile('新的压缩包.zip','r') as zipobj:
print(zipobj.namelist())
rar压缩包
import rarfile
with rarfile.RarFile('新的压缩包.rar','r') as rarobj:
print(rarobj.namelist())
解决压缩包内中文文件名乱码
rar 代码于zip相同
.encode(‘cp437’) .decode(‘gbk’)
import zipfile
with zipfile.ZipFile('新的压缩包.zip','r') as zipobj:
for file_name in zipobj.namelist():
print(file_name.encode('cp437').decode('gbk'))
读取压缩包内文件信息
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)
说明:
- .file_size是原始文件大小
- .compress_size是压缩后大小
- 输出结果单位是字节
解压压缩包
解压压缩包单个文件
.extract(压缩包内要解压的文件名,解压到那个位置)
import zipfile
with zipfile.ZipFile('新的压缩包.zip','r') as zipobj:
zipobj.extract('file.txt','c:/user/desktop/')
注意:中文文件名解压后会出现乱码问题
中文乱码解决
for file_name in zipobj.namelist():
file_path = file_name.encode('cp437').decode('gbk')
建议路径中文件和文件夹不要出现中文
如果有中文可以先获取正确的编码文字,再重命名
解压所有文件
.extractall(path = 解压到哪个位置)
with zipfile.ZipFile('新的压缩包.zip','r') as zipobj:
zipobj.extractall(path = './')
解压含有密码的压缩包
.extractall(path = ‘解压到哪个位置’,pwd = b’密码’)
with zipfile.ZipFile('新的压缩包.zip','r') as zipobj:
zipobj.extractall(path = './',pwd = b'passwd')
创建压缩包
创建压缩包
.write(新建压缩包名)
import zipfile
file_list = ['file1.txt','file2.txt'.'file3.txt']
with zipfile.ZipFile('新压缩包.zip','w') as zipobj:
for file in file_list:
zipobj.write(file)
向已有压缩包添加文件
with zipfile.ZipFile('新压缩包.zip',.'a') as zipobj:
zipobj.write('file4.txt')
综合应用
要求:
- 找出当前目录下所有距离上次修改时间超过3个月的文件
- 将所有文件重命名,再原本文件名开头加上最后修改日期
- 创建一个新的文件夹backup
- 将所有重命名后的文件都添加到压缩包里,给压缩包名字加上今天日期
- 将压缩包移动到backup里面
- 删除原始文件
import os
import shutil
import zipfile
from datetime inport datetime
if not os.path.exists('backup'):
os.mkdir('backup')
file_list = []
for file in os.scandir():
if not file.is_dir():
file_time = file.stat().st_mtime
file_datetime = datetime.fromtimestamp(file_time)
datetime_delta = datetime.now() - file_datetime
if datetime_delta.days >= 3 * 31:
new_name = f'{file_datetime.strftime("%Y-%m-%d")}-(file.name)'
os.rename(file.name,new_name)
file_list.append(new_name)
print(file_list)
zip_filename = f'{datetime.now().strftime("%Y-%m-%d")}.zip'
with zipfile.ZipFile(zip_filename,'w') as zipobj:
for file in file_list:
zipobj.write(file)
shutil.move(zip_filename,'backup/')
for file in file_list:
os.remove(file)