如何使用Python的ZIPFILE模块压缩文件
问题
您希望在Python中创建一个压缩文件。
简介
ZIP文件可以容纳许多其他文件的压缩内容。压缩文件可以减小在磁盘上的大小,在通过互联网或使用Control-m AFT或Connect direct甚至scp在系统之间传输文件时非常有用。
Python程序使用zipfile模块中的函数来创建ZIP文件。
如何操作…
1. 我们将使用zipfile和io包。如果您的系统中缺少任何包,请使用pip安装它们。如果您不确定,请使用pip freeze命令验证包。
2. 我们将编写一个函数以将样例数据写入文件。以下函数write_data_to_files将数据作为输入,并在当前目录中创建一个名为的文件。
示例
# 函数:write_data_to_files
def write_data_to_files (inp_data,file_name):
"""
函数:使用传递给此代码的数据创建CSV文件
args : inp_data : data to be written to the target file
file_name : target file name to store the data
return : none
assumption : File to be created and this code are in same directory.
"""
print(f" *** Writing the data to - {file_name}")
throwaway_storage = io.StringIO(inp_data)
with open(file_name,'w') as f:
for line in throwaway_storage:
f.write(line)
3. 我们现在将编写一个函数file_compress以压缩在上一步中创建的文件。此功能接受文件列表,遍历它们并将其压缩为zip文件。在注释中提供了每个步骤的详细说明。
要创建自己的压缩ZIP文件,需要通过将’w’作为第二个参数传递给ZipFile对象打开ZipFile对象的写入模式。
当您将路径传递给ZipFile对象的write()方法时,Python将压缩该路径上的文件并将其添加到ZIP文件中。
write()方法的第一个参数是要添加的文件的文件名字符串。
第二个参数是压缩类型参数 – 它告诉计算机应该使用哪种算法来压缩文件。
示例
# 函数:file_compress
def file_compress(inp_file_names, out_zip_file):
"""
函数:压缩文件
args : inp_file_names : list of filenames to be zipped
out_zip_file : output zip file
return : none
assumption : Input file paths and this code is in same directory.
"""
# 选择落缩模式 ZIP_DEFLATED 进行压缩
# 或 zipfile.ZIP_STORED 仅存储文件
compression = zipfile.ZIP_DEFLATED
print(f" *** Input File name passed for zipping - {inp_file_names}")
# 先创建ZIP文件的第一个参数路径/名称,第二个模式
print(f' *** out_zip_file is - {out_zip_file}')
zf = zipfile.ZipFile(out_zip_file,mode="w")
try:
for file_to_write in inp_file_names:
# 将文件添加到zip文件
# 第一个参数为zip文件,第二个为zip中的文件名
print(f' *** Processing file {file_to_write}')
zf.write(file_to_write ,file_to_write ,compress_type=compression)
except FileNotFoundError as e:
print(f' *** Exception occurred during zip process - {e}')
finally:
# 别忘了关闭文件!
zf.close()
4. 我们将调用这些函数来创建两个csv文件,然后将它们压缩。我们将使用赢得超过1个大满贯标题的网球选手数据存储到temporary_file1_for_zip.csv文件中,将赢得1个或少于1个大满贯的网球选手存储到temporary_file2_for_zip.csv文件中。然后将这两个文件压缩到temporary.zip文件中。
示例
import zipfile
import io
import pandas as pd
file_name1 = "temporary_file1_for_zip.csv"
file_name2 = "temporary_file2_for_zip.csv"
file_name_list = [file_name1, file_name2]
zip_file_name = "temporary.zip"
# 数据文件1
file_data_1 = """
player,titles
Federer,20
Nadal,20
Djokovic,17
Murray,3
"""
# 数据文件2
file_data_2 = """
player,titles
Theim,1
Zverev,0
Medvedev,0
Rublev,0
"""
# 将 file_data 写入 file_name
write_data_to_files(file_data_1, file_name1)
write_data_to_files(file_data_2, file_name2)
# 将 file_name 压缩为 zip_file_name
file_compress(file_name_list, zip_file_name)
示例
5.将上面几个步骤汇总在一起。
# 定义数据
# 让我们创建一个带有单个文件的zip文件。
import zipfile
import io
import pandas as pd
# 函数:write_data_to_files
def write_data_to_files(inp_data, file_name):
"""
函数:使用传递给此代码的数据创建csv文件
参数:inp_data:要写入目标文件的数据
file_name:目标文件名以存储数据
返回值:无
假设:文件要创建并且此代码在相同的目录中。
"""
print(f" *** 将数据写入- {file_name}")
throwaway_storage = io.StringIO(inp_data)
with open(file_name, 'w') as f:
for line in throwaway_storage:
f.write(line)
# 函数: file_compress
def file_compress(inp_file_names, out_zip_file):
"""
函数:文件压缩
参数:inp_file_names:要压缩的文件名列表
out_zip_file:输出zip文件
返回值:无
假设:输入文件路径和此代码位于同一目录中。
"""
# 选择压缩模式ZIP_DEFLATED进行压缩,或zipfile.ZIP_STORED仅存储文件
compression = zipfile.ZIP_DEFLATED
print(f" *** 传递给压缩的输入文件名- {inp_file_names}")
# 首先创建zip文件第一个参数路径/名称,第二个模式
print(f' *** out_zip_file is - {out_zip_file}')
zf = zipfile.ZipFile(out_zip_file, mode="w")
try:
for file_to_write in inp_file_names:
#将文件添加到zip文件
#第一个参数文件到zip,第二个参数zip中的文件名
print(f' *** 处理文件 {file_to_write}')
zf.write(file_to_write, file_to_write, compress_type=compression)
except FileNotFoundError as e:
print(f' *** 在zip过程中发生异常- {e}')
finally:
#不要忘记关闭文件!
zf.close()
# 主程序
if __name__ == '__main__':
# 定义文件名和数据
file_name1 = "temporary_file1_for_zip.csv"
file_name2 = "temporary_file2_for_zip.csv"
file_name_list = [file_name1, file_name2]
zip_file_name = "temporary.zip"
file_data_1 = """
player,titles
Federer,20
Nadal,20
Djokovic,17
Murray,3
"""
file_data_2 = """
player,titles
Theim,1
Zverev,0
Medvedev,0
Rublev,0
"""
# write the file_data to file_name
write_data_to_files(file_data_1, file_name1)
write_data_to_files(file_data_2, file_name2)
# zip the file_name to zip_file_name
file_compress(file_name_list, zip_file_name)
*** Writing the data to - temporary_file1_for_zip.csv
*** Writing the data to - temporary_file2_for_zip.csv
*** Input File name passed for zipping - ['temporary_file1_for_zip.csv', 'temporary_file2_for_zip.csv']
*** out_zip_file is - temporary.zip
*** Processing file temporary_file1_for_zip.csv
*** Processing file temporary_file2_for_zip.csv
输出
执行上面的代码后,输出为
当前目录中创建 temporary_file2_for_zip.csv。
- 当前目录中创建 temporary.zip 文件。
极客教程