2013-07-19 36 views
0

我有數百個CSV文件壓縮。這非常棒,因爲它們佔用的空間非常小,但在使用它們的時候,我必須在我的HD上留出一些空間,並在我可以處理之前解壓縮它們。我想知道是否可以用python(或者linux命令行)在讀取文件時解壓縮一個文件。換句話說,我想打開一個zip文件,開始解壓縮文件,並在我們去時處理文件。Python/Linux - 讀取文件時解壓縮文件

因此,我的驅動器上不需要額外的空間。任何想法或建議?

+0

我得到了同樣的問題,因爲這傢伙:HTTP:// stackoverflow.com/questions/3170625/unzip-file-while-reading-it,但在Linux上 – user1214120

+0

http://stackoverflow.com/questions/2018512/reading-tar-file-contents-without-untarring-it-in- python-script – seth

+3

看看[zipfile模塊](http://docs.python.org/2/library/zipfile),我想這可能是你正在尋找的東西。 –

回答

0

自1.6版以來,Python提供了模塊zipfile來處理這種情況。一個例子用法:

import csv 
import zipfile 

with zipfile.ZipFile('myarchive.zip') as archive: 
    with archive.open('the_zipped_file.csv') as fin: 
     reader = csv.reader(fin, ...) 
     for record in reader: 
      # process record. 

注意,在python3事情變得有點複雜,因爲archive.open返回的類文件對象產生字節,而csv.reader希望字符串。您可以使用給定的編碼寫一個簡單的類,它從字節字符串轉換:

class EncodingConverter: 
    def __init__(self, fobj, encoding): 
     self._iter_fobj = iter(fobj) 
     self._encoding = encoding 
    def __iter__(self): 
     return self 
    def __next__(self): 
     return next(self._iter_fobj).decode(self._encoding) 

,並用它喜歡:

import csv 
import zipfile 

with zipfile.ZipFile('myarchive.zip') as archive: 
    with archive.open('the_zipped_file.csv') as fin: 
     reader = csv.reader(EncodingConverter(fin, 'utf-8'), ...) 
     for record in reader: 
      # process record. 
+0

謝謝!它有幫助 – user1214120

0

雖然很有可能在 Python中打開ZIP文件,但也可以使用文件系統擴展來透明地處理此操作。如果這是可取的或不取決於各種因素,包括系統訪問和解決方案可移植性。

Fuse-Zip

帶保險絲-ZIP你真的能處理ZIP壓縮文件爲真正的目錄工作。與KIO或Gnome VFS不同,它可以在任何應用程序中使用,無需修改。

或者AVFS: A Virtual File System

動靜脈瘻是一個系統,使所有的程序看看裏面的gzip,焦油,ZIP等文件或查看遠程(FTP,HTTP,DAV等)的文件,而無需重新編譯程序。

請注意,這些解決方案是系統特定的,並依賴於FUSE。 Windows可能有類似的透明解決方案 - 但這需要對特定系統進行另一項調查。