星期一, 四月 02, 2007

python unzip

先,企图利用 os.popen3("unzip ...") 直接来完成,但遇到问题:
fin, fout, ferr = os.popen3("unzip -o -d %s %s" % (dest, zipfile))
strerr = ferr.read()
# 这一步挂起!
if strerr:
print >> sys.stderr, strerr
outlog.error(strerr)
估计是 unzip 命令没有在 stderr 输出文件结束符 EOF。于是只能自己编写相关函数。如下:
import zipfile
def _extract_all(self, destdir):
namelist = self.namelist()
namelist.sort()
for name in namelist:
print "extracting... %s" % name
if name.endswith('/'):
print name
os.mkdir(os.path.join(destdir, name))
else:
outfile = open(os.path.join(destdir, name), 'wb')
outfile.write(self.read(name))
outfile.close()
zipfile.ZipFile.extract_all = _extract_all

def unzip(...):
zipo = zipfile.ZipFile(zipfn, 'r')
zipo.extract_all(dest)
但是这里没有是否覆盖的选项,所以改进方案如下。

改进:
import zipfile
def _extract_all(self, destdir, overwrite=0):
namelist = self.namelist()
namelist.sort()
for name in namelist:
if os.path.exists(name) and not overwrite:
strerr = "destination %s exists" % name
print strerr
outlog.error(strerr)
break
print "extracting... %s" % name
if name.endswith('/'):
try:
os.mkdir(os.path.join(destdir, name))
except OSError:
pass

else:
outfile = open(os.path.join(destdir, name), 'wb')
outfile.write(self.read(name))
outfile.close()
zipfile.ZipFile.extract_all = _extract_all

def unzip(...overwrite=0):
zipo = zipfile.ZipFile(zipfn, 'r')
zipo.extract_all(dest, overwrite)
参考:
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252508
http://www.thescripts.com/forum/thread25297.html

没有评论: