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 模块的主要内容,如果未能解决你的问题,请参考以下文章