本文目录一览:
- [python zip函数](#python zip函数)
- python中zip函数详解
- Python打开zip文件
- python中zip函数有哪些高级用法
- Python实现批量压缩文件/文件夹——zipfile
- [python zip函数的用法](#python zip函数的用法)
python zip函数
zip()
函数用于将可迭代的对象作为参考,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
语法:
zip([iterable, ...])
python中zip函数详解
示例代码:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
b = [5, 9, 2, 4, 5, 7, 3, 1, 7]
c = list(zip(a, b)) # 打包
print(c)
输出内容:
[(1, 5), (2, 9), (3, 2), (4, 4), (5, 5), (6, 7), (7, 3), (8, 1), (9, 7)]
解包示例:
d = list(zip(*c)) # 解包
print(d)
输出内容:
[(1, 2, 3, 4, 5, 6, 7, 8, 9), (5, 9, 2, 4, 5, 7, 3, 1, 7)]
Python打开zip文件
Zip文件格式是通用的文档压缩标准。自1.6版本起,Python中zipfile
模块能够直接处理zip文件里的数据,例如需要将对应目录或多个文件打包或压缩成zip格式,或者需要查看一个zip格式的归档文件中部分或者所有文件同时避免将这些文件展开到磁盘上。使用ZipFile
类来操作zip文件。
创建一个ZipFile对象
参数说明:
file
:文件的路径或者类似文件对象mode
:读"r"
,写入"w"
,添加"a"
compression
:ZIP_STORED
(无压缩),ZIP_DEFLATED
(压缩,需要zlib支持)allowZip64
:默认情况下报错,将其设为True
,ZipFile
将用ZIP64扩展进行创建文件。
示例:读取一个zip文档并解压
import zipfile
if __name__ == "__main__":
zFile = zipfile.ZipFile("F:\\txt.zip", "r")
for fileM in zFile.namelist():
zFile.extract(fileM, "F:\\work")
zFile.close()
read(self, name, pwd=None)
获取ZIP文档内文件的二进制数据。
示例:使用read
方法获取ZIP文档中mango.txt
文件的数据,并写到copy.txt
文件中
import zipfile
if __name__ == "__main__":
zipFile = zipfile.ZipFile('F:\\test.zip', 'r')
data = zipFile.read("mango.txt")
(lambda f, d: (f.write(d), f.close()))(open("F:\\copy.txt", 'w'), data)
zipFile.close()
write(self, filename, arcname=None, compress_type=None)
将指定文件写入ZIP文档中。 参数说明:
filename
:需要写入文件的路径arcname
:文件写入ZIP文档后保存的文件名compress_type
:压缩方法(ZIP_STORED
或ZIP_DEFLATED
) 示例:创建一个zip文档,将test.docx
文件写入压缩文档里面
import zipfile
if __name__ == "__main__":
zipFile = zipfile.ZipFile("F:\\test.zip", "w")
zipFile.write("F:\\test.docx", "ok.docx", zipfile.ZIP_DEFLATED)
zipFile.close()
getinfo(name)
返回一个ZipInfo
类的对象。
示例:
import zipfile
if __name__ == "__main__":
zipFile = zipfile.ZipFile("F:\\test.zip", "r")
zipInfo = zipFile.getinfo("ok.docx")
print("filename:", zipInfo.filename)
print("date_time:", zipInfo.date_time)
常用函数
close()
:关闭归档文件,你必须在退出程序之前调用close()
,否则将不会写入关键记录数据。getinfo(name)
:返回一个ZipInfo
对象,其中包含有关归档成员name
的信息。针对一个目前并不包含于归档中的名称调用getinfo()
将会引发KeyError
。infolist()
:返回一个列表,其中包含每个归档成员的ZipInfo
对象。如果是打开一个现有归档则这些对象的排列顺序与他们对于条目在磁盘上的实际ZIP文件中的顺序一致。namelist()
:返回按名称排列的归档成员列表。open(name, mode='r', pwd=None)
:以二进制文件类对象的形式访一个归档成员。name
可以是归档内某个文件的名称也可以是某个ZipInfo
对象。如果包含了mode
形参,则它必须为"r"
(默认值)或"w"
。pwd
为用于解密已加密Zip文件的密码。open()
也是一个上下文管理器,因此支持with
语句:
with ZipFile('spam.zip') as myzip:
with myzip.open('eggs.txt') as myfile:
print(myfile.read())
extract(member, path=None, pwd=None)
:从归档中提取一个成员放入当前工作目录;member
必须为成员的完整名称或ZipInfo
对象。成员的文件信息会尽可能精确地被提取。path
指定一个要提取到的不同目录。member
可以是一个文件名或ZipInfo
对象。pwd
是用于解密文件的密码。返回所创建的经正规化的路径(对应于目录或新文件)。extractall(path=None, members=None, pwd=None)
:从归档中提取出所有成员放入当前工作目录。path
指定一个要提取到的不同的目录。members
为可选项且必须为namelist()
所返回列表的一个子集。pwd
是用于解密文件的密码。
警告:绝不要未经预先检验就从不可靠的源中提取归档文件。这样有可能在
path
之外创建文件,例如某些成员具有以"/"
开始的文件名或带有两个点号".."
的文件名。此模块会尝试防止这种情况。参见extract()
的注释。
printdir()
:将归档目录表打印到sys.stdout
。setpassword(pwd)
:设置pwd
为用于提取已加密文件的默认密码。read(name, pwd=None)
:返回归档中文件name
的字节数据。name
是归档中文件的名称,或是一个ZipInfo
对象。归档必须以读取或追加方式打开。pwd
为用于已加密文件的密码,并且如果指定该参数则它将覆盖通过setpassword()
设置的默认密码。testzip()
:读取归档中的所有文件并检查它们的CRC和文件头。返回第一个已损坏文件的名称,在其他情况下则返回None
。write(filename, arcname=None, compress_type=None, compresslevel=None)
:将名为filename
的文件写入归档,给予的归档名为arcname
(默认情况下将与filename
一致,但是不带驱动器盘符并会移除开头的路径分隔符)。compress_type
如果给出,它将覆盖作为构造器compression
形参对新条目所给出的值。类似地,compresslevel
如果给出也将覆盖构造器。归档必须使用"w"
、"x"
或"a"
模式打开。writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)
:将一个文件写入归档。内容为data
,它可以是一个str
或bytes
的实例;如果是str
,则会先使用UTF-8进行编码。zinfo_or_arcname
可以是它在归档中将被给予的名称,或者是ZipInfo
的实例。如果它是一个实例,则至少必须给定文件名、日期和时间。如果它是一个名称,则日期和时间会被设为当前日期和时间。归档必须以'w'
、'x'
或'a'
模式打开。
python中zip函数有哪些高级用法
zip()
功能是从参数的多个迭代器中选取元素组合成一个新的迭代器。顾名思义,它就是一个将对象进行打包和解包的函数。
它可以传入的参数包括:元组、列表、字典等迭代器。
它返回一个zip
对象,其内部元素为元组,一组一组的,可以转化为列表或元组。这里要强调一下,Python2和Python3中返回的zip
对象有所不同。
打包:zip(iterables)
上面的代码使用的环境是Python3.6,其中list(z)
操作就是强制转换。注意一个问题,a
和b
这两个列表是不同长短的,这时候zip
函数就会匹配完最短的那个便结束。
当zip
函数的参数只有一个时,它将从iterable
中依次取一个元素,组成一个元组。
解包:zip(*iterables)
解包,与zip
相反,可理解为解压,返回多维矩阵形式,有几个组元素就返回几维的。
比如,下面我是用三个列表组合起来的迭代式,那么解压后就返回三维的矩阵。
高级用法
讲完了基本的再来说一下该函数的高级用法。高级用法离不开一个词:Pythonic,就是将代码写的更优雅美观,看起来有逼格!
1. 列表推导
例如:
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
我们要同时遍历a
、b
,且要对它们进行操作,那就要放在同一个for
循环内,zip
函数正好合适。
注意:如果是Python2环境中,要使用izip
才能提高效率。
当然,如果你需要对下标进行操作,那么还需要加上enumerate
函数。
2. 使用zip
创建键值对
zip
方法返回的是一个元组,用它来创建键值对,简单明了。
Python实现批量压缩文件/文件夹——zipfile
zipfile
是Python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的。
在这里对zipfile
的使用方法做一些记录。即方便自己也方便别人。
Python zipfile
模块用来做zip格式编码的压缩和解压缩的,要进行相关操作,首先需要实例化一个ZipFile
对象。ZipFile
接受一个字符串格式压缩包名称作为它的必选参数,第二个参数为可选参数,表示打开模式,类似于文件操作,有r
、w
、a
三种模式,分别代表读、写、添加,默认为r
,即读模式。
zipfile
里有两个非常重要的class,分别是ZipFile
和ZipInfo
,在绝大多数的情况下,我们只需要使用这两个class就可以了。ZipFile
是主要的类,用来创建和读取zip文件,而ZipInfo
是存储的zip文件的每个文件的信息的。
ZipFile常用的方法和属性:
getinfo(name)
:获取zip文档内指定文件的信息。返回一个zipfile.ZipInfo
对象,它包括文件的详细信息。infolist()
:获取zip文档内所有文件的信息,返回一个zipfile.ZipInfo
的列表。namelist()
:获取zip文档内所有文件的名称列表。extract(member, path=None, pwd=None)
:将zip文档内的指定文件解压到当前目录。参数member
指定要解压的文件名称或对应的ZipInfo
对象;参数path
指定了解压文件保存的文件夹。extractall(path=None, members=None, pwd=None)
:解压zip文档中的所有文件到当前目录。参数members
的默认值为zip文档内的所有文件名称列表,也可以自己设置,选择要解压的文件名称。printdir()
:将zip文档内的信息打印到控制台上。setpassword(pwd)
:设置zip文档的密码。
python zip函数的用法
定义
zip([iterable, ...])
zip()
是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple
(元组),然后返回由这些tuples
组成的list
(列表)。若传入参数的长度不等,则返回list
的长度和参数中长度最短的对象相同。利用*
号操作符,可以将list
解压(unzip),看下面的例子就明白了:
示例:
a = [1, 2, 3]
b = [4, 5, 6]
c = [4, 5, 6, 7, 8]
zipped = zip(a, b)
# [(1, 4), (2, 5), (3, 6)]
zip(a, c)
# [(1, 4), (2, 5), (3, 6)]
zip(*zipped)
# [(1, 2, 3), (4, 5, 6)]
对于这个并不是很常用的函数,下面举几个例子说明它的用法:
二维矩阵变换(矩阵的行列互换)
比如我们有一个由列表描述的二维矩阵:
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
通过Python列表推导的方法,我们也能轻易完成这个任务:
print([[row[col] for row in a] for col in range(len(a[0]))])
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
另外一种让人困惑的方法就是利用zip
函数:
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
zip(*a)
# [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
map(list, zip(*a))
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
这种方法速度更快但也更难以理解,将list
看成tuple
解压,恰好得到我们“行列互换”的效果,再通过对每个元素应用list()
函数,将tuple
转换为list
。
以指定概率获取元素
import random
def random_pick(seq, probabilities):
x = random.uniform(0, 1)
cumulative_probability = 0.0
for item, item_probability in zip(seq, probabilities):
cumulative_probability += item_probability
if x < cumulative_probability:
break
return item
for i in range(15):
print(random_pick("abc", [0.1, 0.3, 0.6]))
输出示例:
c
b
c
c
a
b
c
c
c
a
b
b
c
a
c
这个函数有个限制,指定概率的列表必须和元素一一对应,而且和为1,否则这个函数可能不能像预想的那样工作。
稍微解释下,先利用random.uniform()
函数生成一个0-1之间的随机数并赋值给x
,利用zip()
函数将元素和它对应的概率打包成tuple
,然后将每个元素的概率进行叠加,直到和大于x
终止循环。
这样,"a"
被选中的概率就是x
取值位于0-0.1的概率,同理"b"
为0.1-0.4,"c"
为0.4-1.0,假设x
是在0-1之间平均取值的,显然我们的目的已经达到。