Python Zipfile-整个文件是否解压缩到内存中?

时间:2019-04-09 07:03:13

标签: python python-3.x zip

我有一些代码可用于打开包含一些csv文件的大zip文件,然后对其进行解析。

我在下面使用此代码,但现在我想知道是否实际上是将整个文件解压缩到内存中,然后也将文件内容提取到磁盘中,然后我一步一步地读取文件。

def unzip_file(file_path):

    zip_ref = zipfile.ZipFile(file_path, 'r')

    extracted = zip_ref.namelist()

    zip_ref.extractall('/tmp/extracts')

    zip_ref.close()

    return extracted

这实际上是将文件及其内容解压缩到内存中,然后将文件直接提取到磁盘上吗?之后,我使用extracted变量,因为它包含我需要处理的文件名列表,但我也不想将每个文件都打开到内存中,然后再次读取它们。

1 个答案:

答案 0 :(得分:1)

您担心的是,您在提取文件时浪费了内存或读取文件的方式效率低下。如果您做任何“错误”的答案就是:“否”。您的代码正确无误,并且在完成函数调用后不会将文件保留在内存中。

关于您可以改进的一些注意事项。

使用上下文管理器自动关闭文件

ZipFile还是上下文管理器,通常被认为是最佳实践,使用它来确保关闭文件并正确地从内存中清除文件。您可以执行以下操作,而不是手动调用.close()

with ZipFile(file_path, "r") as zip_ref:
    zip_ref.extractall("/tmp/extracts")

上下文管理器完成后,它将自动关闭文件,并确保没有任何内容存储在内存中。

关闭文件后,您不必担心它将保留在内存中。

无需提取即可读取文件

由于您正在将文件提取到/tmp/文件夹中,所以我猜您实际上不想在磁盘上存储文件。也许您要做的就是读取数据并对其进行处理。

您可以读取zip文件中的每个文件,而无需将其提取到磁盘中。

with ZipFile('spam.zip') as myzip:
    with myzip.open('eggs.txt') as myfile:
        print(myfile.read())

根据您要实现的目标,这可能是更好的解决方案。您可以从python docs中看到更多信息。