2017-02-23 46 views
3

我有一個大的zip文件,其中包含許多我想要通過塊解壓縮的文件,以避免消耗太多內存。通過python中的塊解壓縮文件夾

我試過使用python模塊zipfile,但我沒有找到一種方法來通過塊加載存檔並將其解壓縮到磁盤上。

有沒有簡單的方法來做到這一點在python中?

編輯

@史蒂芬 - rumbalski正確地指出的是zipfile正確地解壓縮文件處理一個大文件通過一個無需加載完整存檔。

我的問題在於,我的zip文件位於AWS S3上,而且我的EC2實例無法在RAM中加載這樣一個大文件,因此我通過塊下載了該文件,並且我想通過塊來解壓縮它。

回答

0

您可以使用壓縮文件(或可能tar文件)如下:

import zipfile 

def extract_chunk(fn, directory, ix_begin, ix_end): 
    with zipfile.ZipFile("{}/file.zip".format(directory), 'r') as zf: 
     infos = zf.infolist() 
     print(infos) 
     for ix in range(max(0, ix_begin), min(ix_end, len(infos))): 
       zf.extract(infos[ix], directory) 
     zf.close() 

directory = "path" 
extract_chunk("{}/file.zip".format(directory), directory, 0, 50) 
+0

參數'ix_begin'和'ix_end'似乎並沒有被使用。 (此外,這似乎試圖解決與OP狀態不同的問題。) – 9000

4

你並不需要特殊的方法來提取大量歸檔到磁盤。源Lib/zipfile.py顯示zipfile已經具有內存有效性。創建一個zipfile.ZipFile對象不會將整個文件讀入內存。而是隻讀入ZIP文件的目錄。 ZipFile.extractall()一次提取一個文件使用shutil.copyfileobj()io.BufferedIOBase的子類複製。

如果你想要做的是一次性提取Python提供的命令行的快捷方式:

python -m zipfile -e archive.zip target-dir/ 
+0

你是正確的zipfile句柄,相當不錯。但是我的情況有點複雜。關鍵是我的zip文件位於S3服務器上,並且我無法加載完整的zip文件,因爲實例無法在RAM中處理它,所以我通過塊下載了zip文件,並且想要將它解壓縮爲片段 – Bertrand

+2

You don不需要在RAM中有整個文件。您仍然需要在磁盤__上存放整個文件,因爲zip處理需要在文件內部尋找。要將文件下載到磁盤,您也不需要將其全部讀入內存;通過塊讀取它並將其按塊寫入臨時文件,然後使用此文件就足夠了。 – 9000

+0

Thx @ 9000,你說得對。我只是希望我可以避免將文件寫入磁盤。 – Bertrand