在python中使用zip文件
本文解释如何使用一个简单的python程序在zip文件上执行各种操作
什么是zip文件
ZIP是一种支持无损数据压缩的归档文件格式。通过无损压缩,我们的意思是压缩算法可以从压缩数据中完美地重构原始数据。因此,ZIP文件是包含一个或多个压缩文件的单个文件,它提供了一种理想的方法使大文件变小,并将相关文件放在一起。
因为对zip操作的模块是内建的,所以我们不需要下载第三方库
1、提取zip文件
#导入zip库
from zipfile import ZipFile
#要提取的zip文件名
file_name = "my_python_files.zip"
#以读的方式打开zip文件
with ZipFile(file_name,'r') as zip:
#打印zip文件内的目录
zip.printdir()
#提取所有文件
print('Extracting all the files now...')
zip.extractall()
print('Done!!')
上面这段脚本将本目录下的名为"my_python_files.zip"中的文件进行了提取
执行后,输出就像这样:
File Name Modified Size
OperatingSystemsImportSample.csv 2011-07-22 10:17:16 1155
OperatingSystemsNotInstalledSample.csv 2011-07-22 10:17:16 1738
UsersImportCompleteSample.csv 2011-07-22 10:17:16 1339
UsersImportMinimumSample.csv 2011-07-22 10:17:16 172
UsersImportSimpleSample.csv 2011-07-22 10:17:18 694
AssetsImportCompleteSample.csv 2011-10-04 10:00:10 8650
AssetsImportExtendedSample.csv 2011-10-04 10:00:12 1549
AssetsImportMinimumSample.csv 2011-07-22 10:17:12 79
AssetsImportSimpleSample.csv 2011-07-22 10:17:12 701
CIsImportMinimumSample.csv 2011-07-22 10:17:12 126
ComputerSystemsImportSample.csv 2011-07-22 10:17:14 1243
Extracting all the files now...
Done!!
我们来仔细分析一下上面的代码
from zipfile import ZipFile
ZipFile 是zipfile模块中用来写入和读取zip文件的一个类,在这里我们只是导入了zipfile模块中的ZipFile类
with ZipFile(file_name, 'r') as zip:
在这里,ZipFile对象是通过调用ZipFile构造函数生成的的,该函数接受zip文件名和模式参数。我们在读的模式下创建一个ZipFile对象,并将其命名为zip。
zip.printdir()
print方法打印存档文件的目录
zip.extractall()
extractall()方法会将当前zip工作目录内的所有文件提取出来。你也可以使用extract()方法提取当前zip目录内给定详细路径的任意文件。
比如:
zip.extract('python_files/python_wiki.txt')
这仅会提取具体的文件
如果你想读取具体的文件,可以使用:
data = zip.read(name_of_file_to_read)
2、写zip文件
在这里,我们需要遍历整个目录及其子目录,以便在将所有文件路径写入zip文件之前获得它们的列表。
from zipfile import ZipFile
import os
def get_all_file_paths(directory):
#初始化一个空的路径列表
file_paths = []
#遍历所有的目录和子目录
for root,directories,files in os.walk(directory):
for filename in files:
#连接这两个字符串以形成完整的文件路径。
filepath = os.path.join(root,filename)
file_paths.append(filepath)
#返回所有的目录路径
return file_paths
def main():
#需要压缩的文件夹的路径
directory = './python'
#调用函数获得所有文件的完整路径
file_path = get_all_file_paths(diretory)
#打印出要被压缩的文件列表
print('Following files will be zipped:')
for file_name in file_paths:
print(file_name)
#压缩文件
with ZipFile('my_python_files.zip','w') as zip:
#逐个压缩
for file in file_paths:
zip.write(file)
print('All files zipped successfully!')
if __name__ == '__main__':
main()
在我的机子上,执行程序后,输出为:
Following files will be zipped:
./python\csv.py
./python\csvexample.py
./python\djx.mp3
./python\douban.py
./python\downpic.py
./python\merge.py
./python\pdfreader.py
./python\pychrm.py
./python\PyPdf.py
./python\watermark.py
./python\zip.py
./python\zipwrite.py
./python\.idea\.name
./python\.idea\codeStyleSettings.xml
./python\.idea\encodings.xml
./python\.idea\misc.xml
./python\.idea\modules.xml
./python\.idea\python.iml
./python\.idea\workspace.xml
All files zipped successfully!
[Finished in 0.4s]
代码分析:
def get_all_file_paths(directory):
file_paths = []
for root, directories, files in os.walk(directory):
for filename in files:
filepath = os.path.join(root, filename)
file_paths.append(filepath)
return file_paths
首先,为了获得目录中的所有文件路径,我们创建了这个函数,它使用os.walk()方法。在每次迭代中,该目录中的所有文件都被追加到名字为file_paths的列表中。最后,我们返回所有文件路径。
file_paths = get_all_file_paths(directory)
在这里,我们将要压缩的目录传递给get_all_file_paths()函数,并获得一个包含所有文件路径的列表。
with ZipFile('my_python_files.zip','w') as zip:
这里,我们在写模式下创建一个ZipFile对象。
for file in file_paths:
zip.write(file)
在这里,我们使用write方法将所有文件逐个写入zip文件。
3、获取zip文件的所有信息
from zipfile import ZipFile
import datetime
#zip文件名称
file_name = 'example.zip'
#以读的模式打开一个zip文件
with ZipFile(file_name,'r') as zip:
for info in zip.infolist():
print(info.filename)
print('\nModified:\t' + str(datetime.datetime(*info.date_time)))
print('\tSystem:\t\t' + str(info.create_system) + '(0 = Windows, 3 = Unix)')
print('\tZIP version:\t' + str(info.create_version))
print('\tCompressed:\t' + str(info.compress_size) + ' bytes')
print('\tUncompressed:\t' + str(info.file_size) + ' bytes')
输出结果:
python/csv.py
Modified: 2018-11-30 14:33:42
System: 0(0 = Windows, 3 = Unix)
ZIP version: 20
Compressed: 1121 bytes
Uncompressed: 1121 bytes
python/csvexample.py
Modified: 2018-12-02 11:43:26
System: 0(0 = Windows, 3 = Unix)
ZIP version: 20
Compressed: 830 bytes
Uncompressed: 830 bytes
分析代码:
for info in zip.infolist():
在这里,infolist()方法创建一个ZipInfo类的实例,该实例包含关于zip文件的所有信息。
我们可以访问文件的最后修改日期、文件名、创建文件的系统、Zip版本、压缩和未压缩格式文件的大小等所有信息。