目的
将zip存档拆分为较小的zip存档,每个新zip文件均匀分布的文件数。
示例
源zip(100个文件)
目标拉链(每个25个文件):
描述
所以我已经能够打开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文件保存到与脚本不同的文件夹中?
答案 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。