定義:zip([iterable, ...])
公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出南芬免費做網(wǎng)站回饋大家。
zip()是Python的一個內(nèi)建函數(shù),它接受一系列可迭代的對象作為參數(shù),將對象中對應(yīng)的元素打包成一個個tuple(元組),然后返回由這些 tuples組成的list(列表)。若傳入?yún)?shù)的長度不等,則返回list的長度和參數(shù)中長度最短的對象相同。利用*號操作符,可以將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)]
對于這個并不是很常用函數(shù),下面舉幾個例子說明它的用法:
* 二維矩陣變換(矩陣的行列互換)
比如我們有一個由列表描述的二維矩陣
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
通過python列表推導(dǎo)的方法,我們也能輕易完成這個任務(wù)
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函數(shù):
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解壓,恰好得到我們“行列互換”的效果,再通過對每個元素應(yīng)用list()函數(shù),將tuple轉(zhuǎn)換為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'
這個函數(shù)有個限制,指定概率的列表必須和元素一一對應(yīng),而且和為1,否則這個函數(shù)可能不能像預(yù)想的那樣工作。
稍微解釋下,先利用random.uniform()函數(shù)生成一個0-1之間的隨機數(shù)并復(fù)制給x,利用zip()函數(shù)將元素和他對應(yīng)的概率打包成tuple,然后將每個元素的概率進行疊加,直到和大于x終止循環(huán)
這樣,”a”被選中的概率就是x取值位于0-0.1的概率,同理”b”為0.1-0.4,”c”為0.4-1.0,假設(shè)x是在0-1之間平均取值的,顯然我們的目的已經(jīng)達到
【常見的內(nèi)置函數(shù)】
1、enumerate(iterable,start=0)
是python的內(nèi)置函數(shù),是枚舉、列舉的意思,對于一個可迭代的(iterable)/可遍歷的對象(如列表、字符串),enumerate將其組成一個索引序列,利用它可以同時獲得索引和值。
2、zip(*iterables,strict=False)
用于將可迭代的對象作為參數(shù),將對象中對應(yīng)的元素打包成一個個元組,然后返回由這些元組組成的列表。如果各個迭代器的元素個數(shù)不一致,則返回列表長度與最短的對象相同,利用*號操作符,可以將元組解壓為列表。
3、filter(function,iterable)
filter是將一個序列進行過濾,返回迭代器的對象,去除不滿足條件的序列。
4、isinstance(object,classinfo)
是用來判斷某一個變量或者是對象是不是屬于某種類型的一個函數(shù),如果參數(shù)object是classinfo的實例,或者object是classinfo類的子類的一個實例,
返回True。如果object不是一個給定類型的的對象, 則返回結(jié)果總是False
5、eval(expression[,globals[,locals]])
用來將字符串str當成有效的表達式來求值并返回計算結(jié)果,表達式解析參數(shù)expression并作為Python表達式進行求值(從技術(shù)上說是一個條件列表),采用globals和locals字典作為全局和局部命名空間。
【常用的句式】
1、format字符串格式化
format把字符串當成一個模板,通過傳入的參數(shù)進行格式化,非常實用且強大。
2、連接字符串
常使用+連接兩個字符串。
3、if...else條件語句
Python條件語句是通過一條或多條語句的執(zhí)行結(jié)果(True或者False)來決定執(zhí)行的代碼塊。其中if...else語句用來執(zhí)行需要判斷的情形。
4、for...in、while循環(huán)語句
循環(huán)語句就是遍歷一個序列,循環(huán)去執(zhí)行某個操作,Python中的循環(huán)語句有for和while。
5、import導(dǎo)入其他腳本的功能
有時需要使用另一個python文件中的腳本,這其實很簡單,就像使用import關(guān)鍵字導(dǎo)入任何模塊一樣。
python一堆文件解壓方法如下。
壓縮包解壓要用的是zipfile這個包。
zip_file = zipfile.ZipFile(r'D:\數(shù)據(jù)源\XX_%s.zip'%yday)
zip_list = zip_file.namelist() # 壓縮文件清單,可以直接看到壓縮包內(nèi)的各個文件的明細
for f in zip_list: # 遍歷這些文件,逐個解壓出來,
zip_file.extract(f,r'D:\數(shù)據(jù)源')
zip_file.close() # 不能少!
print('昨日日志解壓完成,請在文件夾中驗收!') # 當然我是不需要查收的(*/ω\*)
這里的解壓操作實際就相當于鼠標右鍵“解壓到當前文件夾”的效果。
完成解壓后運行.close()是個比較好的習(xí)慣,否則可能會導(dǎo)致包括但不限于:
文件會一直被占用著,可能無法重新打開;
在進程結(jié)束之前文件都刪不掉;
文件內(nèi)容不能即時 flush 到磁盤直到進程結(jié)束;
到此,整個流程在無需打開瀏覽器和文件夾的情況下便自動完成了。
為了方便日常運行代碼,這里把上面的兩個流程包裝成一個函數(shù),下載解壓
#下載昨日日志
def download_XXlog():
yday = (date.today()+timedelta(days=-1)).strftime('%Y%m%d') # 獲取昨日日期
r =? requests.get(''%yday) # 獲取以日期命名的壓縮包信息
with open(r'D:\數(shù)據(jù)源\XX_%s.zip'%yday,'wb') as code: # 將壓縮包內(nèi)容寫入到 "D:\數(shù)據(jù)源\" 下,并按日期命名
code.write(r.content)
print('昨日XX日志下載完成。')
zip_file = zipfile.ZipFile(r'D:\數(shù)據(jù)源\XX_%s.zip'%yday)
zip_list = zip_file.namelist() # 壓縮文件清單,可以直接看到壓縮包內(nèi)的各個文件的明細
for f in zip_list: # 遍歷這些文件,逐個解壓出來,
? ? zip_file.extract(f,r'D:\數(shù)據(jù)源')
zip_file.close() # 不能少!
print('昨日日志解壓完成,請在文件夾中驗收!')
download_XXlog()
拓展
作為拓展,這里再加一個可以根據(jù)實際情況輸入(input)起始和終止日期,來下載一個特定時間段日志的函數(shù),這里就涉及了datetime和time這兩個工具包了。
一、zip函數(shù)的功能如下:
將可迭代的對象作為參數(shù),將對象中對應(yīng)的元素打包成一個個元組,然后返回由這些元組組成的列表。當各個迭代器中元素的個數(shù)不一致時,則返回列表中長度最短的情況,利用 *號操作符,可以將元組解壓為列表。
二、Python.3.x中使用zip函數(shù)生成列表的方法如下:
1、作出說明,使用zip函數(shù)將可迭代的對象作為參數(shù)。
2、將對象中對應(yīng)的元素打包成一個個元組。
3、用zip函數(shù)平行地遍歷多個迭代器,如果可迭代對象的長度不相同將按短的序列為準。
4、遍歷過程中產(chǎn)生元組,Python.3.x會把元組生成好,然后生成列表。
import zipfile
# 傳入壓縮文件zfile.zip獲取相關(guān)信息
zip_file = zipfile.ZipFile('zfile.zip')
# 獲取壓縮文件中的內(nèi)容
f_content = zip_file.namelist()
# 壓縮前的大小
f_size = zip_file.getinfo('zfile/a.txt').file_size
# 壓縮后的大小
c_size = zip_file.getinfo('zfile/a.txt').compress_size
ZipFile 對象有一個 namelist()方法,返回 ZIP 文件中包含的所有文件和文件夾 的字符串的列表。這些字符串可以傳遞給 ZipFile 對象的 getinfo()方法,返回一個關(guān) 于特定文件的 ZipInfo 對象。ZipInfo 對象有自己的屬性,諸如表示字節(jié)數(shù)的 file_size 和 compress_size,它們分別表示原來文件大小和壓縮后文件大小。ZipFile 對象表示 整個歸檔文件,而 ZipInfo 對象則保存該歸檔文件中每個文件的有用信息。
從 ZIP 文件中解壓縮
ZipFile 對象的 extractall()方法從 ZIP 文件中解壓縮所有文件和文件夾,放到當 前工作目錄中。
import zipfile
zip_file = zipfile.ZipFile('zfile.zip')
# 解壓
zip_extract = zip_file.extractall()
zip_extract.close()
運行這段代碼后, example.zip 的內(nèi)容將被解壓縮到 C:\。 或者, 你可以向 extractall()傳遞的一個文件夾名稱,它將文件解壓縮到那個文件夾,而不是當前工作 目錄。如果傳遞給 extractall()方法的文件夾不存在,它會被創(chuàng)建。例如,如果你用 exampleZip.extractall('C:\ delicious')取代?處的調(diào)用,代碼就會從 example.zip 中解壓 縮文件,放到新創(chuàng)建的 C:\delicious 文件夾中。
ZipFile 對象的 extract()方法從 ZIP 文件中解壓縮單個文件。
創(chuàng)建和添加到 ZIP 文件
要創(chuàng)建你自己的壓縮 ZIP 文件,必須以“寫模式”打開 ZipFile 對象,即傳入'w' 作為第二個參數(shù)(這類似于向 open()函數(shù)傳入'w',以寫模式打開一個文本文件)。
如果向 ZipFile 對象的 write()方法傳入一個路徑,Python 就會壓縮該路徑所指 的文件,將它加到 ZIP 文件中。write()方法的第一個參數(shù)是一個字符串,代表要添 加的文件名。第二個參數(shù)是“壓縮類型”參數(shù),它告訴計算機使用怎樣的算法來壓 縮文件??梢钥偸菍⑦@個值設(shè)置為 zipfile.ZIP_DEFLATED(這指定了 deflate 壓縮 算法,它對各種類型的數(shù)據(jù)都很有效)。
import zipfile
zip_file = zipfile.ZipFile('new.zip','w')
# 把zfile整個目錄下所有內(nèi)容,壓縮為new.zip文件
zip_file.write('zfile',compress_type=zipfile.ZIP_DEFLATED)
# 把c.txt文件壓縮成一個壓縮文件
# zip_file.write('c.txt',compress_type=zipfile.ZIP_DEFLATED)
zip_file.close()
這段代碼將創(chuàng)建一個新的 ZIP 文件,名為 new.zip,它包含 spam.txt 壓縮后的內(nèi)容。
要記住,就像寫入文件一樣,寫模式將擦除 ZIP 文件中所有原有的內(nèi)容。如果 只是希望將文件添加到原有的 ZIP 文件中,就要向 zipfile.ZipFile()傳入'a'作為第二 個參數(shù),以追加模式打開 ZIP 文件。
def?unzip_file(zip_src,?dst_dir):
r?=?zipfile.is_zipfile(zip_src)
if?r:?????
fz?=?zipfile.ZipFile(zip_src,?'r')
for?file?in?fz.namelist():
fz.extract(file,?dst_dir)???????
else:
print('This?is?not?zip')
#zip_src:是zip文件的全路徑
#dst_dir:是要解壓到的目的文件夾
以上代碼是Python3中的實現(xiàn)方式,謝謝