资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

python中解压函数 Python解压

python zip函数的用法

定义:zip([iterable,

创新互联建站专注于大城网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供大城营销型网站建设,大城网站制作、大城网页设计、大城网站官网定制、成都小程序开发服务,打造大城网络公司原创品牌,更为您提供大城网站排名全网营销落地服务。

...])

zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些

tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。利用*号操作符,可以将list

unzip(解压),看下面的例子就明白了:

1

2

3

4

5

6

7

8

9

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列表推导的方法,我们也能轻易完成这个任务

1

2

print

[

[row[col]

for

row

in

a]

for

col

in

range(len(a[0]))]

[[1,

4,

7],

[2,

5,

8],

[3,

6,

9]]

另外一种让人困惑的方法就是利用zip函数:

1

2

3

4

5

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

*

以指定概率获取元素

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

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):

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之间平均取值的,显然我们的目的已经达到

下载python然后有一堆文件要解压

python一堆文件解压方法如下。

压缩包解压要用的是zipfile这个包。

zip_file = zipfile.ZipFile(r'D:\数据源\XX_%s.zip'%yday)

zip_list = zip_file.namelist() # 压缩文件清单,可以直接看到压缩包内的各个文件的明细

for f in zip_list: # 遍历这些文件,逐个解压出来,

zip_file.extract(f,r'D:\数据源')

zip_file.close() # 不能少!

print('昨日日志解压完成,请在文件夹中验收!') # 当然我是不需要查收的(*/ω\*)

这里的解压操作实际就相当于鼠标右键“解压到当前文件夹”的效果。

完成解压后运行.close()是个比较好的习惯,否则可能会导致包括但不限于:

文件会一直被占用着,可能无法重新打开;

在进程结束之前文件都删不掉;

文件内容不能即时 flush 到磁盘直到进程结束;

到此,整个流程在无需打开浏览器和文件夹的情况下便自动完成了。

为了方便日常运行代码,这里把上面的两个流程包装成一个函数,下载解压

#下载昨日日志

def download_XXlog():

yday = (date.today()+timedelta(days=-1)).strftime('%Y%m%d') # 获取昨日日期

r =  requests.get(''%yday) # 获取以日期命名的压缩包信息

with open(r'D:\数据源\XX_%s.zip'%yday,'wb') as code: # 将压缩包内容写入到 "D:\数据源\" 下,并按日期命名

code.write(r.content)

print('昨日XX日志下载完成。')

zip_file = zipfile.ZipFile(r'D:\数据源\XX_%s.zip'%yday)

zip_list = zip_file.namelist() # 压缩文件清单,可以直接看到压缩包内的各个文件的明细

for f in zip_list: # 遍历这些文件,逐个解压出来,

    zip_file.extract(f,r'D:\数据源')

zip_file.close() # 不能少!

print('昨日日志解压完成,请在文件夹中验收!')

download_XXlog()

拓展

作为拓展,这里再加一个可以根据实际情况输入(input)起始和终止日期,来下载一个特定时间段日志的函数,这里就涉及了datetime和time这两个工具包了。

python怎样压缩和解压缩ZIP文件

1、python使用zipfile模块压缩和解压ZIP文件

2、读取zip文件

首先,通过zipfile模块打开指定zip文件,如:

zpfd = zipfile.ZipFile(path, mode='r')

对于zipfile,其标志与open所用的打开文件标志有所不同,不能识别 'rb'。

然后,读取zip文件中的内容,zipfile对象提供一个read(name)的方法,name为zip文件中的一个文件入口,执行完成之后,将返回读出的内容,如:

for filename in zpfd.namelist():

tmpcont = zpfd.read(filename)

print 'len(tmpcont)', 'tmpcont'

需要注意的是,读取zip文件时,只能读取内容

3、写入zip文件

首先,需要zipfile模块写打开或创建zip文件,如:

zpfd = zipfile.ZipFile(path, mode='w')

写打开是标志可以为'w'或'a'('a'表示写入一个zip文件), 或者传入第三个参数cmopression压缩标志

compression=zipfile.ZIP_DEFLATED 需要导入zlib模块

compression=zipfile.ZIP_STORED则表示只对文件进行打包,并不压缩

入有两种方式,一种是直接写入一个已经存在的文件,可使用zipfile对象中write(filename, arcname,

compress_type)第一个参数为文件名,第二个参数指写入zip文件中的文件名,默认与filename一致,第三个参数压缩标志可以覆盖打开

zipfile时的使用参数;另一种是写入一个字符串,可使用zipfile对象中的writestr(zinfo_or_arcname,

bytes),第一个参数是zipinfo对象或写到zip文件中的压缩名,第二个参数是待写入的字符串

4、最后,对于打开的zipfile对象需要进行关闭,从而使得写入内容真正写入磁盘,即:

zpfd.close()


网站标题:python中解压函数 Python解压
文章起源:http://www.cdkjz.cn/article/hphjoc.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220