def pojie_zip(FilePath,PwdPath): zipFile = zipfile.ZipFile(FilePath , 'r' , zipfile.ZIP_DEFLATED) passFile = open ( PwdPath ,'r' ) file = zipFile.namelist()
for pwd in passFile.readlines(): Pwds = pwd.rstrip('\n') Bpwd=Pwds.encode("utf-8") #轉換編碼 try: zipFile.extractall('F:/None',None,Bpwd) for file in zipFile.namelist(): zipFile.extract(file , r'F:/None' , Bpwd) print( "1" ) zipFile.close() break
except: pass passFile.close() zipFile.close() if __name__== '__main__' : pojie_zip( 'F:/test.zip' , 'F:/pwd.txt' )
/******************** 總結 **********************/
先說 File 文件
zipFile = zipfile.ZipFile(FilePath , 'r' , zipfile.ZIP_DEFLATED)
打開一個文件,並返回這個對象;
FilePath:打開文件的路徑
’r‘:說明打開的方式 (這里是只讀形式)
zipfile.ZIP_DEFLATED: 是說壓縮編寫的方式(具體api介紹)
passFile = open ( PwdPath ,'r' )
打開一個文件,並返回這文件對象;
PwdPath:打開的文件路徑
’r‘:說明是只讀方式
file = zipFile.namelist( )
返回打開的zip包內的所有文件名,包括目錄下的文件名,返回類型<class 'list'>類型的字符串
passFile.readlines( ):
返回文件的一行內容,返回類型 <class 'str'> 類型的字符串
Pwds = pwd.rstrip('\n')
rstrip(char) 默認去除字符串后面的空格,這里是要求去除 \n ,這個函數是 python 3版本以上使用
python 2版本為 strip(char) 沒有前面的 r。 因為是pwd是<class 'str'>類型 所有 Pwds也是這個類型的字符串
Bpwd=Pwds.encode("utf-8") #轉換編碼
這個方法是將<class 'str'>類型 轉換為 <class 'tybe'>類型,如果不轉換 則下個函數無法使用Bpwd變量
zipFile.extractall('F:/None',None,Bpwd)
文件對象調用 extractall()函數來解壓 zip 文件,解壓所有文件
參數1:是將解壓的文件保存在哪里或哪個文件夾下面,參數類型<class ,'str'>
參數2:是要解壓的具體文件,這里None是讓它默認解壓所有文件
參數3:是解壓需要的密碼,這個密碼需要 <class 'type'> 類型的字符串,這里有兩種方法可以使用這個類型 第一種是 b"123" 加前綴 b ,第二中就是使用上面的函數將變量轉換為這個類型。
zipFile.extract(file , r'F:/None' , Bpwd)
和上面的函數一樣,只不過是解壓單個文件,參數的位置不同
參數1:需要解壓的文件名,參數類型<class ,'str'>
參數2:需要解壓完存放的地方,參數類型<class ,'str'>
參數3:解壓時需要的密碼,這里的密碼也是需要 <class 'type'>類型的字符串,兩種方法同上
passFile.close()
zipFile.close()
兩個對象都是調用關閉 io 的方法
總結: 寫的時候沒怎么思考,對函數的理解不太徹底,在運行報錯的時候總是不管不顧的百度去搜索,找到后復制粘貼就不了了之了,這個破解里卡的最厲害的部分就是 zipFile.extractall('F:/None',None,Bpwd) 這個函數的參數都需要什么類型,我一開始沒不知道,所以運行時總是報錯,要不就是解壓出來后文件夾目錄是空的,直到最后想起別人的提醒,才慢慢的向參數類型這方面的查找,最后找了半天總算是找到了。總結你對一個函數要了解透徹,不然運行報錯你都不知道錯在哪里。
解決問題的網址:
開始是想字符串轉數字的思路:
第一個是字符串與數值的轉換:
http://blog.163.com/liuyuhuan0915@126/blog/static/782654482011413114712117/
s = string.atoi( ' 18 ' , 16)
(即'18'為16進制數的字符串,轉換為對應的10進制整數形式)
通過查 api 知道了這個 轉換時在 python 2 版本就被拋棄了得,所以不能用。其中還一些和它同等類的函數一樣是被拋棄的
string.atof(s) 浮點數轉換
第二是通過切片查找轉換類型:
https://segmentfault.com/q/1010000002620209
def find(s):
for i in range(len(s)): if not '0'<=s[i]<='9': return i return len(s)
s = '234jdsf23232ks' idx = find(s)
t = int(s[ 0 :idx])
但是 通過 type(t) 的出的類型是 <class 'int'>類型 顯然這不是我需要的 <class 'byte'>的類型
后來通過找 api 才知道 這個 <class 'byte'> 類型是 Unicode 編碼格式,所以我想是不是可以通過自定義編碼格式改它的類型,最終在這個網站上找到了修改字符串編碼格式的函數
http://www.runoob.com/python3/python3-string.html