本文介绍如何压缩单个或多个文件,或者文件夹下的所有文件;如何解压缩压缩文件中的单个文件或所有文件;如何读取压缩文件的信息。
Python | 压缩文件/文件夹及解压缩
可行库
用于压缩文件/文件夹或解压缩的可行的几种第三方库
库名 | 说明 |
---|---|
zipfile | |
tarfile |
tarfile 的用法和zipfile 大同小异,详情查看这里
|
shutil | 详情见官方文档,其中需注意的是shutil.make_archive 不是线程安全的。 |
读取信息
zipfile
-
读取目标路径下的zip file并以
zip_file
来存储fromPath = './TEST/output.zip'
zip_file = zipfile.ZipFile(fromPath)
-
压缩文件中的所有文件
fileList = zip_file.namelist()
-
某文件压缩前后大小
某文件为file
,file = fileList[2]
—— 压缩前文件大小为b_size = zip_file.getinfo(file).file_size
—— 压缩后文件大小为a_size = zip_file.getinfo(file).compress_size
压缩
此处总结如何使用上述提到的第三方库来对相应文件/文件夹进行压缩打包。
zipfile
此处总结如何使用zipfile
压缩单个或多个文件,指定文件夹下的所有文件,又或者添加文件或整个文件夹到指定zip文件
指定单个文件或多个文件
import zipfile
import os
# 1. define target folder and target path to export zip file
fromPath1 = './test.py'
fromPath2 = './DataAnalysis/Pandas/RawData.xlsx'
toPath = './Test/output.zip'
# 2. check if target path to export output.zip file exists: if yes, pass; if not, pass;
toFolder, toFilename = os.path.split(toPath)
if not os.path.exists(toFolder):
os.mkdir(path=toFolder)
toFolder, toFilename = os.path.split(toPath)
# 3.
with zipfile.ZipFile(toPath, 'w') as Export:
Export.write(fromPath1)
Export.write(fromPath2)
定义被压缩打包的目标文件所在路径,比如这里的
fromPath1
和fromPath2
判断目标路径toFolder
是否存在:
如果存在,进行下一步;如果不存在,创建toFolder
。
将对应fromPath1
和fromPath2
的文件以Export
写入toPath
的output.zip
指定文件夹下的所有文件
# 1. define target folder and target path to export zip file
fromPath = './DataAnalysis/Pandas'
toPath = './Test/output.zip'
# 2. check if target path to export output.zip file exists: if yes, pass; if not, pass;
toFolder, toFilename = os.path.split(toPath)
if not os.path.exists(toFolder):
os.mkdir(path=toFolder)
# 3. check if target path is for a file or a folder:
with zipfile.ZipFile(toPath, 'w') as Export:
# 3.1 if file: write file in target path
if os.path.isfile(fromPath):
Export.write(filename=fromPath)
# 3.2 if folder: write files under folder into target path
if os.path.isdir(fromPath):
for root, dirs, files in os.walk(top=fromPath):
for singleFile in files:
if singleFile != toFilename:
filepath = os.path.join(root, singleFile)
Export.write(filename=filepath)
定义被压缩打包的目标文件夹,和输出压缩zip文件的目标文件名及所在路径。
判断目标路径toFolder
是否存在:
如果存在,进行下一步;如果不存在,创建toFolder
。
判断目标路径fromPath
为文件所在或文件夹所在路径:
如果为文件,则按指定单个文件或多个文件
所示的方法写入
如果为文件夹,则轮询文件夹路径并将其下级文件写入
添加文件或文件夹
import zipfile
import os
fromPath = './test.py'
toPath = './Test/output.zip'
with zipfile.ZipFile(toPath, 'a') as Add:
if os.path.isfile(fromPath):
Add.write(fromPath)
if os.path.isdir(fromPath):
for root, dirs, files in os.walk(fromPath):
for singleFile in files:
filepath = os.path.join(root, singleFile)
Add.write(filepath)
定义需要被添加文件的所在路径,和压缩zip文件所在路径。
判断目标路径toFolder
是文件还是文件夹:
如果是文件,以指定单个文件或多个文件
中所介绍方法写入Add
; 如果是文件夹,以指定文件夹下的所有文件
中所介绍方法写入Add
shutil
此处总结如何使用shutil
归档指定文件,或指定文件夹下的所有文件,为指定输出格式。
import shutil
fromPath = 'DataAnalysis/Pandas'
toPath = './Test/output'
shutil.make_archive(toPath, 'zip', fromPath)
定义需要被归档的文件夹所在路径(也可以是单个或多个文件的路径),和存储归档文件的目标路径。
解压
此处总结如何使用上述提到的第三方库来对相应文件/文件夹进行解压缩。
zipfile
指定压缩包中的指定文件或所有文件
fromPath = './Test/output.zip'
toPath = './ZIP'
pwd = 'password'
if not os.path.exists(toPath):
os.mkdir(toPath)
with zipfile.ZipFile(fromPath, 'r') as Import:
# check file list of target zip file; <class 'list'>
print('File List: ', Import.namelist())
# read first file in file list
print(Import.read(Import.namelist()[0]))
# unzip 2nd file in namelist() to path
Import.extract(path=toPath, member=Import.namelist()[1], pwd=pwd)
# unzip all in namelist() to path
z.extractall(path=toPath, pwd=pwd)
读取
fromPath
,可以通过namelist()
以列表的形式打印出output.zip
文件中的所有文件名
可以通过namelist
来查看压缩文件中有哪些文件。
可以通过read()
读取namelist()
中存在的文件的内容。
可以通过extract(member=Import.namelist()[x])
来解压缩单个或多个文件到指定当前路径toPath
,又或者以extractall
来解压缩所有的文件到上述路径下。
参考链接
写本文时有参考以下链接:
python 分离文件名和路径 以及 分离文件名和后缀
使用Python实现文件压缩和解压
python中zipfile、tarfile压缩文件模块的使用
【zipfile】Python实现将文件打包为zip压缩包 & 解压
python zipfile 打包文件夹,压缩文件夹为zip包
Python3 错误:PermissionError: [Errno 13] Permission denied 如何解决?「xsl,csv」成功解决
Python报错:PermissionError: [Errno 13] Permission denied解决方案详解
shutil — 高阶文件操作¶