当前位置:  开发笔记 > 编程语言 > 正文

你如何在python中解压缩非常大的文件?

如何解决《你如何在python中解压缩非常大的文件?》经验,为你挑选了2个好方法。

使用python 2.4和内置ZipFile库,我无法读取非常大的zip文件(大于1或2 GB),因为它想要将未压缩文件的全部内容存储在内存中.有没有其他方法可以做到这一点(使用第三方库或其他一些黑客),或者我必须"解决"并以这种方式解压缩(显然不是跨平台).



1> S.Lott..:

这是大文件解压缩的概述.

import zipfile
import zlib
import os

src = open( doc, "rb" )
zf = zipfile.ZipFile( src )
for m in  zf.infolist():

    # Examine the header
    print m.filename, m.header_offset, m.compress_size, repr(m.extra), repr(m.comment)
    src.seek( m.header_offset )
    src.read( 30 ) # Good to use struct to unpack this.
    nm= src.read( len(m.filename) )
    if len(m.extra) > 0: ex= src.read( len(m.extra) )
    if len(m.comment) > 0: cm= src.read( len(m.comment) ) 

    # Build a decompression object
    decomp= zlib.decompressobj(-15)

    # This can be done with a loop reading blocks
    out= open( m.filename, "wb" )
    result= decomp.decompress( src.read( m.compress_size ) )
    out.write( result )
    result = decomp.flush()
    out.write( result )
    # end of the loop
    out.close()

zf.close()
src.close()


@ s-lott什么是`ex = src.read(len(m.extra))`和`cm = src.read(len(m.comment))`你用什么变量`ex`和`cm`对于?你是什​​么意思使用结构解压缩它是好的?用什么神奇数字`30`?

2> Martijn Piet..:

从Python 2.6开始,您可以使用ZipFile.open()在文件上打开文件句柄,并将内容有效地复制到您选择的目标文件中:

import errno
import os
import shutil
import zipfile

TARGETDIR = '/foo/bar/baz'

with open(doc, "rb") as zipsrc:
    zfile = zipfile.ZipFile(zipsrc)
    for member in zfile.infolist():
       target_path = os.path.join(TARGETDIR, member.filename)
       if target_path.endswith('/'):  # folder entry, create
           try:
               os.makedirs(target_path)
           except (OSError, IOError) as err:
               # Windows may complain if the folders already exist
               if err.errno != errno.EEXIST:
                   raise
           continue
       with open(target_path, 'wb') as outfile, zfile.open(member) as infile:
           shutil.copyfileobj(infile, outfile)

这用于shutil.copyfileobj()有效地从打开的zipfile对象读取数据,将其复制到输出文件.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有