我想在zip文件中包含二进制文件,下面是代码片段: 我首先将zip内容解压缩到一个临时位置,然后添加更多文件并将其压缩回新的存档。
import zipfile
def test(fileName, tempDir):
# unzip the file contents,may contain binary files
myZipFile=zipfile.ZipFile(fileName,'r')
for name in myZipFile.namelist():
toFile = tempDir + '/' + name
fd = open(toFile, "w")
fd.write(myZipFile.read(name))
fd.close()
myZipFile.close()
# code which post processes few of the files goes here
#zip it back
newZip = zipfile.ZipFile(fileName, mode='w')
try:
fileList = os.listdir(tempDir)
for name in fileList:
name = tempDir + '/' + name
newZip.write(name,os.path.basename(name))
newZip.close()
except Exception:
print 'Exception occured while writing to PAR file: ' + fileName
某些文件可能是二进制文件。压缩代码工作正常但是当我尝试使用linux的unzip或python的zip模块解压缩时,我得到以下错误:
zipfile损坏。 (请检查您是否已转让或 以适当的BINARY模式创建了zip文件 编译正确解压缩)
我正在使用python 2.3
这里出了什么问题?
答案 0 :(得分:2)
你可能想要升级,因为Python 2.3真的已经过时了。 2.7.3是2.x版本中的最新版本和最新版本的3.2.3版本。
请参阅docs.python.org:
| extractall(self, path=None, members=None, pwd=None)
| Extract all members from the archive to the current working
| directory. `path' specifies a different directory to extract to.
| `members' is optional and must be a subset of the list returned
| by namelist().
(2.6版中的新功能)
看看Zip a folder and its content。
您可能也对distutlis.archive_util感兴趣。
答案 1 :(得分:2)
嗯,不确定它是否是python 2.3中的一个错误。当前的工作环境不允许我升级到更高版本的python :-( :-(: - (
以下解决方法有效:
import zipfile
def test(fileName, tempDir):
# unzip the file contents,may contain binary files
myZipFile=zipfile.ZipFile(fileName,'r')
for name in myZipFile.namelist():
toFile = tempDir + '/' + name
# check if the file is a binary file
#if binary file, open it in "wb" mode
fd = open(toFile, "wb")
#else open in just "w" mode
fd = open(toFile, "w")
fd.write(myZipFile.read(name))
fd.close()
myZipFile.close()
# code which post processes few of the files goes here
#zip it back
newZip = zipfile.ZipFile(fileName, mode='w')
try:
fileList = os.listdir(tempDir)
for name in fileList:
name = tempDir + '/' + name
newZip.write(name,os.path.basename(name))
newZip.close()
except Exception:
print 'Exception occured while writing to PAR file: ' + fileName