本文目錄一覽:
- 1、python zip函數
- 2、python中zip函數詳解
- 3、Python打開zip文件
- 4、python中zip函數有哪些高級用法
- 5、Python實現批量壓縮文件/文件夾——zipfile
- 6、python zip函數的用法
python zip函數
zip()函數用於將可迭代的對象作為參考,將對象中對應的元素打包成一個個遠足,然後返回有這些元祖組成的列表。
zip([iterabale,….])
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對象,表示一個zip文件。
參數file:文件的路徑或者類似文件對象
參數mode:讀”r”,寫入”w”,添加”a”
參數compression: ZIP_STORED(無壓縮),ZIP_DEFLATED(壓縮,需要zlib支持)
參數allowZip64:默認情況下報錯,將其設為True,ZipFile將用ZIP64擴展進行創建文件。
下面示例演示了讀取一個zip文檔,將文檔里所有文件解壓到名為”work”的文件里。
import zipfile
if __name__ == “__main__”:
zFile = zipfile.ZipFile(“F:\\txt.zip”,”r”)
#ZipFile.namelist():獲取ZIP文檔內所有文件的名稱列表
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_DEFAULED)
下面離子演示了創建一個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__”:
zipInfo = zipFile.getinfo(ok.docx)
print(“filename:”,zipInfo.filename)
print(“date_time:”,zipInfo.date_time)
常用函數
關閉歸檔文件,你必須在退出程序之前調用close()否則將不會寫入關鍵記錄數據。
返回一個ZipInfo對象,其中包含有關歸檔成員name的信息。針對一個目前並不包含于歸檔中的名稱調用getinfo()將會引發KeyError。
返回一個列表,其中包含每個歸檔成員的ZipInfo對象。如果是打開一個現有歸檔則這些對象的排列順序與他們對於條目在磁盤上的實際ZIP文件中的順序一致。
返回按名稱排列的歸檔成員列表。
以二進制文件類對象的形式訪一個歸檔成員。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())
如果mode為“r”則文件類對象(ZipExtFile)將只讀並且提供下列方法:read(),readline(),readlines(),seek(),tell(),__iter__(),__next__()。這些對象可獨立於ZipFile進行操作。
如果mode=’w’則返回一個可寫入的文件句柄,它將支持write()方法。當一個可寫入的文件句柄被打開時,嘗試讀寫ZIP文件中的其他文件將會引發ValueError。
當寫入一個文件時,如果文件大小不能預先確定但是可能超過2GiB,可傳入force_zip64=True以確保標頭格式能夠支持超大文件。如果文件大小可以預先確定,則在構造ZipInfo對象時應設置file_size,並將其作name形參。
從歸檔中提取一個成員放入當前工作目錄;member必須為成員的完整名稱或ZipInfo對象。成員的文件信息會儘可能精確地被提取。path指定一個要提取到的不同目錄。member可以是一個文件名或ZipInfo對象。pwd是用於解密文件的密碼。返回所創建的經正規化的路徑(對應於目錄或新文件)。
從歸檔中提取出所有成員放入當前工作目錄。path指定一個要提取到的不同的目錄。members為可選項且必須為namelist()所返回列表的一個子集。pwd是用於解密文件的密碼。
警告:絕不要未經預先檢驗就從不可靠的源中提取歸檔文件。 這樣有可能在 path 之外創建文件,例如某些成員具有以 “/” 開始的文件名或帶有兩個點號 “..” 的文件名。 此模塊會嘗試防止這種情況。 參見 extract() 的注釋。
將歸檔是目錄表打印到sys.stdout.
設置pwd為用於提取已加密文件的默認密碼。
返回歸檔中文件name的字節數據。name是歸檔中文件的名稱,或是一個ZipInfo對象。歸檔必須以讀取或追加方式打開。pwd為用於已加密文件的密碼,並且如果指定該參數則它將覆蓋通過setpassword()設置的默認密碼。 on a ZipFile that uses a compression method 在使用 ZIP_STORED , ZIP_DEFLATED , ZIP_BZIP2 或 ZIP_LZMA 以外的壓縮方法的 ZipFile 上調用 read() 將引發 NotImplementedError 。 如果相應的壓縮模塊不可用也會引發錯誤。
讀取歸檔中的所有文件並檢查他們的CRC和文件頭。返回第一個已損壞文件的名稱,在其他情況下則返回None。
將名為filename的文件寫入歸檔,給予的歸檔名為arcname(默認情況下將與filename一致,但是不帶驅動器盤符並會移除開頭的路徑分隔符)。compress_type如果給出,它將覆蓋作為構造器compression形參對於新條目所給出的值。類似地,compresslevel如果給出也將覆蓋構造器。歸檔必須使用”w”,”x“或”a”模式打開。
將一個文件寫入歸檔。 內容為 data ,它可以是一個 str 或 bytes 的實例;如果是 str ,則會先使用 UTF-8 進行編碼。 zinfo_or_arcname 可以是它在歸檔中將被給予的名稱,或者是 ZipInfo 的實例。 如果它是一個實例,則至少必須給定文件名、日期和時間。 如果它是一個名稱,則日期和時間會被設為當前日期和時間。 歸檔必須以 ‘w’, ‘x’ 或 ‘a’ 模式打開。
ZIP文件的名稱
python中zip函數有哪些高級用法
zip() 功能是從參數的多個迭代器中選取元素組合成一個新的迭代器。顧名思義,它就是一個將對象進行打包和解包的函數。
它可以傳入的參數包括;元組、列表、字典等迭代器
它返回一個zip對象,其內部元素為元組,一組一組的,可以轉化為列表或元組,這裡要強調一下,Python2和Python3中返回的zip對象有所不同。
Python3中zip()函數再不再返回list對象,但是可以通過list強行轉換。(類似的函數變化還有dictionary關聯的keys()、values()、items(),map(),filter())。
打包zip(iterables)
上面的代碼使用的環境是Python3.6,其中list (z)操作就是強制轉換。注意一個問題,a和b這兩個列表是不同長短的,這時候zip函數就會匹配完最短的那個便結束。
當zip函數的參數只有一個時,它將從iterable中依次取一個元素,組成一個元組。
解包zip(*iterables)
解包,zip 相反,可理解為解壓,返回多維矩陣形式,有幾個組元素就返回幾維的。
比如,下面我是用三個列表組合起來的迭代式,那麼解壓後就返回三維的矩陣
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還提供了如下常用的方法和屬性:
獲取zip文檔內指定文件的信息。返回一個zipfile.ZipInfo對象,它包括文件的詳細信息。
獲取zip文檔內所有文件的信息,返回一個zipfile.ZipInfo的列表。
獲取zip文檔內所有文件的名稱列表。
將zip文檔內的指定文件解壓到當前目錄。參數member指定要解壓的文件名稱或對應的ZipInfo對象;參數path指定了解析文件保存的文件夾;
解壓zip文檔中的所有文件到當前目錄。參數members的默認值為zip文檔內的所有文件名稱列表,也可以自己設置,選擇要解壓的文件名稱。
將zip文檔內的信息打印到控制台上。
設置zip文檔的密碼。
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之間平均取值的,顯然我們的目的已經達到
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/198274.html