我想将一个文件从一个zip文件提取到一个特定的路径,忽略归档文件中的文件路径。这在Python2.6中非常简单(我的docstring比代码长)import shutil
import zipfile
def extract_from_zip(name, dest_path, zip_file):
"""Similar to zipfile.ZipFile.extract but extracts the file given by name
from the zip_file (instance of zipfile.ZipFile) to the given dest_path
*ignoring* the filename path given in the archive completely
instead of preserving it as extract does.
"""
dest_file = open(dest_path, 'wb')
archived_file = zip_file.open(name)
shutil.copyfileobj(archived_file, dest_file)
extract_from_zip('path/to/file.dat', 'output.txt', zipfile.ZipFile('test.zip', 'r'))
但是在Python2.5中,ZipFile.open方法不可用。我找不到stackoverflow的解决方案,但是this forum post有一个很好的解决方案,它利用^{}来查找zip中的正确点,并使用^{}从那里解压字节。不幸的是,ZipInfo.file_offset在python2.5中被删除了!在
因此,考虑到Python2.5中只有^{},我想我只需要解析并跳过头结构就可以自己获得文件偏移量。使用Wikipedia作为a reference(我知道),我想出了一个长得多而且不太优雅的解决方案。在
^{pr2}$
请注意,我是如何解包并读取给出额外字段长度的字段的,因为对ZipInfo.extra属性调用len会减少4个字节,从而导致偏移量计算错误。也许我遗漏了什么?在
有人能改进这个Python2.5的解决方案吗?在
编辑:我应该说,ChrisAdams建议的显而易见的解决方案dest_file.write(zip_file.read(name))
对于zip中包含的任何大小合理的文件,都将失败,MemoryError,因为它试图一次性将整个文件拖入内存。我有大文件,所以我需要将内容流式输出到磁盘。在
另外,升级Python是显而易见的解决方案,但它完全不在我的掌控之中,而且基本上是不可能的。在