Python如何将zip中的文件复制到内存中的另一个zip?

时间:2015-08-04 14:14:34

标签: python zip zipfile

目的

将zip存档拆分为较小的zip存档,每个新zip文件均匀分布的文件数。

示例

源zip(100个文件)

  • 的src / 100-Test.zip

目标拉链(每个25个文件):

  • destination / 1.zip
  • 目的地/ 2.zip
  • 目的地/ 3.zip
  • 目的地/ 4.zip

描述

所以我已经能够打开zip文件并遍历内容将它们拆分,但我无法写入文件。由于我没有对拉链内容做任何事情,我不认为我必须做任何StringIO的东西或什么?

代码

var ticks = JSON.stringify(myArray);
console.log(ticks);

错误

我在zipFileNameSrc = '100-Test.zip' zipFile = open(zipFileNameSrc) unzippedFile = zipfile.ZipFile(zipFile) imgList = [(s, unzippedFile.read(s)) for s in unzippedFile.namelist() if (".jpg" or ".JPG") in s] #image names: imgList[i][0] and images: imgList[i][1] #... #...additional logic to split into sets of 25 images #...fileTuplesList = imgList[:25] zipNo = 1 #zipFileDest = destination + "/" + zipSrcNm + "/" + zipNo.__str__() + ".zip" zipFileName = zipNo.__str__() + ".zip" zipOut = zipfile.ZipFile(zipFileName, 'w') for i in xrange(len(fileTuplesList)): fileNameAndPath = fileTuplesList[i][0] actualFile = fileTuplesList[i][1] zipOut.write(fileNameAndPath, actualFile) zipOut.close() #move_files(zipFileName, zipFileDest)

上联系了这个
  

OSError:[Errno 2]没有这样的文件或目录:' 100-Test / 17.jpg'

加成

如何将zip文件保存到与脚本不同的文件夹中?

2 个答案:

答案 0 :(得分:2)

ZipFile.write()期望文件名作为第一个参数,该文件应存在于系统中。如果是,则将该特定文件复制到zip存档中。

你实际上想要使用 - ZipFile.writestr() - 它希望archivename作为第一个参数,data作为第二个参数。

此外,您可以在任何地方创建zip存档,只需使用os.path.join()在创建zipFileName时将目录加入zip文件名。做你想要的代码示例 -

import os.path
zipFileNameSrc = '100-Test.zip'
zipFile = open(zipFileNameSrc)
unzippedFile = zipfile.ZipFile(zipFile)
imgList = [(s, unzippedFile.read(s)) for s in unzippedFile.namelist() if (".jpg" or ".JPG") in s]
#image names: imgList[i][0]  and  images: imgList[i][1]

#...
#...additional logic to split into sets of 25 images
#...fileTuplesList = imgList[:25]
zipNo = 1
#zipFileDest = destination + "/" + zipSrcNm + "/" + zipNo.__str__() + ".zip"
zipFileName = os.path.join('<directory for zip>',zipNo.__str__() + ".zip")
zipOut = zipfile.ZipFile(zipFileName, 'w')
for i in xrange(len(fileTuplesList)):
    fileNameAndPath = fileTuplesList[i][0]
    actualFile = fileTuplesList[i][1]
    zipOut.writestr(fileNameAndPath, actualFile)
zipOut.close()

在我的系统中运行的示例/演示代码 -

import zipfile
import os.path
zipFileNameSrc = 'ziptest.zip'
zipFile = open(zipFileNameSrc, 'rb')
unzippedFile = zipfile.ZipFile(zipFile)
imgList = [(s, unzippedFile.read(s)) for s in unzippedFile.namelist() if (".png" or ".PNG")]
for i in range(1,5):
    zipFileName = os.path.join('<some location>','ziptest_' + str(i) + '.zip')
    print('Creating ', zipFileName)
    zipOut = zipfile.ZipFile(zipFileName, 'w')
    for j in range(25):
        ind = (i-1)*25 + j
        fileNameAndPath = imgList[ind][0]
        actualFile = imgList[ind][1]
        zipOut.writestr(fileNameAndPath, actualFile)
    zipOut.close()

答案 1 :(得分:0)

你有zipOut.write()参数向后。第一个参数是您要写的文件,第二个参数是您要为文件提供的名称(您也可以将其留空,并且只使用文件名)。

fileNameAndPath = fileTuplesList[i][0]
actualFile = fileTuplesList[i][1]
zipOut.write(fileNameAndPath, actualFile)

https://docs.python.org/3.4/library/zipfile.html#zipfile.ZipFile.write

ZipFile.write(filename, arcname=None, compress_type=None)

将名为filename的文件写入存档,为其提供存档名称arcname(默认情况下,这将与文件名相同,但没有驱动器号并且删除了前导路径分隔符)。如果给定,则compress_type会将为压缩参数指定的值覆盖为新条目的构造函数。存档必须以“w”或“a”模式打开 - 在使用模式“r”创建的ZipFile上调用write()将引发RuntimeError。在关闭的ZipFile上调用write()将引发RuntimeError。