Python 和 zipfile 模块

Posted

技术标签:

【中文标题】Python 和 zipfile 模块【英文标题】:Python and the zipfile module 【发布时间】:2015-01-29 21:26:45 【问题描述】:

根据 Python 文档:

ZipFile.extract(成员[, path[, pwd]]) 从存档中提取成员到当前工作目录; member 必须是其全名或 ZipInfo 对象)。它的 尽可能准确地提取文件信息。 路径 指定要提取到的不同目录。成员可以是 文件名或 ZipInfo 对象。 pwd 是用于加密的密码 文件。

我有大量的压缩文件,每个压缩文件都包含 1000 个存档文件。使用上面的函数,我可以从每个压缩档案中只提取我需要的文件:

def getAIDlist(aidlist_to_keep,ifile,folderName):

    archive = zipfile.ZipFile(ifile) #
    aidlist=archive.namelist() # gets the names of all files in the zipped archive

    print "AIDs to keep",aidlist_to_keep

    print  "Number of AIDs in the zipped archive ",len(aidlist)

    path='/2015/MyCODE/'+folderName

    for j in aidlist_to_keep:
        for k in aidlist:
            if j in k:
                try:
                    archive.extract(k,path)
                except:
                    print "Could Not Extract file ",(j)
                    pass

    return
if __name__ == '__main__':
    getAIDlist(['9593','9458','9389'],"0009001_0010000.zip","TestingFolder")

理想情况下,我希望将提取的文件存储到TestingFolder 中,但它们存储在TestingFolder 内新创建的文件夹0009001_0010000.zip 中。

如何将提取的文件直接导入TestingFolder,但不创建新文件夹0009001_0010000.zip

【问题讨论】:

我试过你的代码。对我来说,文件直接提取到TestingFolder。没有创建新文件夹 真的吗?您使用的是哪个版本的 Python?我正在运行 Python 2.7.9 :: Anaconda 2.1.0 (x86_64) 。我尝试了多次,但文件夹 0009001_0010000.zip 总是在 TestingFolder 中创建。 【参考方案1】:

您可以使用ZipFile.open(),而不是使用extract(),并将文件复制到您自己选择的文件名;使用shutil.copyfileobj() 有效地复制数据:

import shutil

archive = zipfile.ZipFile(ifile)
path = os.path.join('/2015/MyCODE', folderName)

for name in aidlist_to_keep:
    try:
        archivefile = archive.open(name)
    except KeyError:
        # no such file in the archive
        continue
    with open(os.path.join(path, name), 'wb') as targetfile:
        shutil.copyfileobj(archivefile, targetfile)

【讨论】:

以上是关于Python 和 zipfile 模块的主要内容,如果未能解决你的问题,请参考以下文章

python模块 zipfile

python3中zipfile模块的常用方法

Python 和 zipfile 模块

Python_面向对象_zipfile和tarfile

python zipfile模块和optparse模块暴力破解zip文件

Python之zipfile模块的使用