在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 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: ./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 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:\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版本、压缩和未压缩格式文件的大小等所有信息。
作者:dmzlingyin
链接:https://www.jianshu.com/p/0136753ad5e3