zip的使用
在python中使用zip檔案
本文解釋如何使用一個簡單的python程式在zip檔案上執行各種操作
什麼是zip檔案
ZIP是一種支援無損資料壓縮的歸檔檔案格式。通過無失真壓縮,我們的意思是壓縮演算法可以從壓縮資料中完美地重構原始資料。因此,ZIP檔案是包含一個或多個壓縮檔案的單個檔案,它提供了一種理想的方法使大檔案變小,並將相關檔案放在一起。
因為對zip操作的模組是內建的,所以我們不需要下載第三方庫
1、提取zip檔案
#匯入zip庫 from zipfile import ZipFile #要提取的zip檔名 file_name = "my_python_files.zip" #以讀的方式開啟zip檔案 with ZipFile(file_name,'r') as zip: #列印zip檔案內的目錄 zip.printdir() #提取所有檔案 print('Extracting all the files now...') zip.extractall() print('Done!!')
上面這段指令碼將本目錄下的名為"my_python_files.zip"中的檔案進行了提取
執行後,輸出就像這樣:
File NameModifiedSize OperatingSystemsImportSample.csv2011-07-22 10:17:161155 OperatingSystemsNotInstalledSample.csv2011-07-22 10:17:161738 UsersImportCompleteSample.csv2011-07-22 10:17:161339 UsersImportMinimumSample.csv2011-07-22 10:17:16172 UsersImportSimpleSample.csv2011-07-22 10:17:18694 AssetsImportCompleteSample.csv2011-10-04 10:00:108650 AssetsImportExtendedSample.csv2011-10-04 10:00:121549 AssetsImportMinimumSample.csv2011-07-22 10:17:1279 AssetsImportSimpleSample.csv2011-07-22 10:17:12701 CIsImportMinimumSample.csv2011-07-22 10:17:12126 ComputerSystemsImportSample.csv2011-07-22 10:17:141243 Extracting all the files now... Done!!
我們來仔細分析一下上面的程式碼
from zipfile import ZipFile
ZipFile 是zipfile模組中用來寫入和讀取zip檔案的一個類,在這裡我們只是匯入了zipfile模組中的ZipFile類
with ZipFile(file_name, 'r') as zip:
在這裡,ZipFile物件是通過呼叫ZipFile建構函式生成的的,該函式接受zip檔名和模式引數。我們在讀的模式下建立一個ZipFile物件,並將其命名為zip。
zip.printdir()
print方法列印存檔檔案的目錄
zip.extractall()
extractall()方法會將當前zip工作目錄內的所有檔案提取出來。你也可以使用extract()方法提取當前zip目錄內給定詳細路徑的任意檔案。
比如:
zip.extract('python_files/python_wiki.txt')
這僅會提取具體的檔案
如果你想讀取具體的檔案,可以使用:
data = zip.read(name_of_file_to_read)
2、寫zip檔案
在這裡,我們需要遍歷整個目錄及其子目錄,以便在將所有檔案路徑寫入zip檔案之前獲得它們的列表。
from zipfile import ZipFile import os def get_all_file_paths(directory): #初始化一個空的路徑列表 file_paths = [] #遍歷所有的目錄和子目錄 for root,directories,files in os.walk(directory): for filename in files: #連線這兩個字串以形成完整的檔案路徑。 filepath = os.path.join(root,filename) file_paths.append(filepath) #返回所有的目錄路徑 return file_paths def main(): #需要壓縮的資料夾的路徑 directory = './python' #呼叫函式獲得所有檔案的完整路徑 file_path = get_all_file_paths(diretory) #打印出要被壓縮的檔案列表 print('Following files will be zipped:') for file_name in file_paths: print(file_name) #壓縮檔案 with ZipFile('my_python_files.zip','w') as zip: #逐個壓縮 for file in file_paths: zip.write(file) print('All files zipped successfully!') if __name__ == '__main__': main()
在我的機子上,執行程式後,輸出為:
Following files will be zipped: ./python\csv.py ./python\csvexample.py ./python\djx.mp3 ./python\douban.py ./python\downpic.py ./python\merge.py ./python\pdfreader.py ./python\pychrm.py ./python\PyPdf.py ./python\watermark.py ./python\zip.py ./python\zipwrite.py ./python\.idea\.name ./python\.idea\codeStyleSettings.xml ./python\.idea\encodings.xml ./python\.idea\misc.xml ./python\.idea\modules.xml ./python\.idea\python.iml ./python\.idea\workspace.xml All files zipped successfully! [Finished in 0.4s]
程式碼分析:
def get_all_file_paths(directory): file_paths = [] for root, directories, files in os.walk(directory): for filename in files: filepath = os.path.join(root, filename) file_paths.append(filepath) return file_paths
首先,為了獲得目錄中的所有檔案路徑,我們建立了這個函式,它使用os.walk()方法。在每次迭代中,該目錄中的所有檔案都被追加到名字為file_paths的列表中。最後,我們返回所有檔案路徑。
file_paths = get_all_file_paths(directory)
在這裡,我們將要壓縮的目錄傳遞給get_all_file_paths()函式,並獲得一個包含所有檔案路徑的列表。
with ZipFile('my_python_files.zip','w') as zip:
這裡,我們在寫模式下建立一個ZipFile物件。
for file in file_paths: zip.write(file)
在這裡,我們使用write方法將所有檔案逐個寫入zip檔案。
3、獲取zip檔案的所有信息
from zipfile import ZipFile import datetime #zip檔名稱 file_name = 'example.zip' #以讀的模式開啟一個zip檔案 with ZipFile(file_name,'r') as zip: for info in zip.infolist(): print(info.filename) print('\nModified:\t' + str(datetime.datetime(*info.date_time))) print('\tSystem:\t\t' + str(info.create_system) + '(0 = Windows, 3 = Unix)') print('\tZIP version:\t' + str(info.create_version)) print('\tCompressed:\t' + str(info.compress_size) + ' bytes') print('\tUncompressed:\t' + str(info.file_size) + ' bytes')
輸出結果:
python/csv.py Modified:2018-11-30 14:33:42 System:0(0 = Windows, 3 = Unix) ZIP version:20 Compressed: 1121 bytes Uncompressed:1121 bytes python/csvexample.py Modified:2018-12-02 11:43:26 System:0(0 = Windows, 3 = Unix) ZIP version:20 Compressed: 830 bytes Uncompressed:830 bytes
分析程式碼:
for info in zip.infolist():
在這裡,infolist()方法建立一個ZipInfo類的例項,該例項包含關於zip檔案的所有資訊。
我們可以訪問檔案的最後修改日期、檔名、建立檔案的系統、Zip版本、壓縮和未壓縮格式檔案的大小等所有資訊。