Python / Linux - 在阅读时解压缩文件

时间:2013-07-19 23:32:46

标签: python command-line

我有数百个压缩的CSV文件。这很好,因为它们占用的空间非常小,但是当它需要使用时,我必须在我的HD上留出一些空间并在我处理之前解压缩它们。我想知道是否可以使用python(或linux命令行)在读取文件时解压缩文件。换句话说,我想打开一个zip文件,开始解压缩文件,然后我们去处理文件。

因此我的驱动器上不需要额外的空间。有什么想法或建议吗?

2 个答案:

答案 0 :(得分:0)

虽然可以在 Python中打开ZIP文件,但也可以使用文件系统扩展名透明地处理此操作。如果这是优选的,取决于各种因素,包括系统访问和解决方案的可移植性。

请参阅Fuse-Zip

  

使用fuse-zip,你真的可以使用ZIP档案作为真实目录。与KIO或Gnome VFS不同,它可以在任何应用程序中使用而无需修改。

AVFS: A Virtual File System

  

AVFS是一个系统,它允许所有程序查看gzip,tar,zip等文件或查看远程(ftp,http,dav等)文件,而无需重新编译程序。

请注意,这些解决方案是系统特定的,并且依赖于FUSE。 Windows可能有类似的透明解决方案 - 但这需要对特定系统进行另一次调查。

答案 1 :(得分:0)

Python,自1.6版本以来,提供了模块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.