我压缩了数百个 CSV 文件。这很棒,因为它们占用的空间很小,但是当需要使用它们时,我必须在我的 HD 上腾出一些空间并解压缩它们,然后才能进行处理。我想知道是否可以在读取文件时使用 python(或 linux 命令行)解压缩文件。换句话说,我想打开一个 zip 文件,开始解压缩文件,然后处理文件。
所以我的驱动器上不需要额外的空间。有什么想法或建议吗?
我压缩了数百个 CSV 文件。这很棒,因为它们占用的空间很小,但是当需要使用它们时,我必须在我的 HD 上腾出一些空间并解压缩它们,然后才能进行处理。我想知道是否可以在读取文件时使用 python(或 linux 命令行)解压缩文件。换句话说,我想打开一个 zip 文件,开始解压缩文件,然后处理文件。
所以我的驱动器上不需要额外的空间。有什么想法或建议吗?
虽然很可能在Python 中打开 ZIP 文件,但也可以使用文件系统扩展透明地处理此操作。这是否可取取决于各种因素,包括系统访问和解决方案的可移植性。
见Fuse-Zip:
使用 fuse-zip,您真的可以将 ZIP 存档作为真实目录使用。与 KIO 或 Gnome VFS 不同,它可以在任何应用程序中使用而无需修改。
AVFS 是一个系统,它使所有程序无需重新编译程序即可查看 gzip、tar、zip 等文件或查看远程(ftp、http、dav 等)文件。
请注意,这些解决方案是特定于系统的,并且依赖于FUSE。Windows 可能有类似的透明解决方案——但这需要对特定系统进行另一次调查。
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.