我有一些代码可用于打开包含一些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
变量,因为它包含我需要处理的文件名列表,但我也不想将每个文件都打开到内存中,然后再次读取它们。
答案 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中看到更多信息。