本文解释如何使用一个简单的python程序在zip文件上执行各种操作
什么是zip文件ZIP是一种支持无损数据压缩的归档文件格式。通过无损压缩,我们的意思是压缩算法可以从压缩数据中完美地重构原始数据。因此,ZIP文件是包含一个或多个压缩文件的单个文件,它提供了一种理想的方法使大文件变小,并将相关文件放在一起。
1、提取zip文件因为对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 SizeOperatingSystemsimportSample.csv 2011-07-22 10:17:16 1155OperatingSystemsNotInstalledSample.csv 2011-07-22 10:17:16 1738UsersimportCompleteSample.csv 2011-07-22 10:17:16 1339UsersimportMinimumSample.csv 2011-07-22 10:17:16 172UsersimportSimpleSample.csv 2011-07-22 10:17:18 694AssetsimportCompleteSample.csv 2011-10-04 10:00:10 8650AssetsimportExtendedSample.csv 2011-10-04 10:00:12 1549AssetsimportMinimumSample.csv 2011-07-22 10:17:12 79AssetsimportSimpleSample.csv 2011-07-22 10:17:12 701CIsimportMinimumSample.csv 2011-07-22 10:17:12 126ComputerSystemsimportSample.csv 2011-07-22 10:17:14 1243Extracting 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 ZipFileimport osdef 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_pathsdef 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: ./pythoncsv.py ./pythoncsvexample.py ./pythondjx.mp3 ./pythondouban.py ./pythondownpic.py ./pythonmerge.py ./pythonpdfreader.py ./pythonpychrm.py ./pythonPyPdf.py ./pythonwatermark.py ./pythonzip.py ./pythonzipwrite.py ./python.idea.name ./python.ideacodeStyleSettings.xml ./python.ideaencodings.xml ./python.ideamisc.xml ./python.ideamodules.xml ./python.ideapython.iml ./python.ideaworkspace.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 ZipFileimport 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:tt' + 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版本、压缩和未压缩格式文件的大小等所有信息。
作者:dmzlingyin
链接:https://www.jianshu.com/p/0136753ad5e3



