没办法简单的从文档中删除或修改一个文件
解决办法是遍历所有文件
如果不是目标文件,就读出(没有解压缩),写入新文档
如果是目标文件,就删除,或解压缩出来进行修改,修改后压缩入新文档。
参见这儿
python 中处理 zip 文档的包为 zipfile
使用例子
# -*- coding: utf-8 -*- import sys import os import subprocess import shutil import zipfile as zf import cssutils # FORCE_REPLACE: 1 not css processing, use replacing # 0 css processing FORCE_REPLACE = 1 def epub_proc(src, des, tmpdir): '''Epub file processing. src: src epub file des: des epub file tmpdir: tmp folder An Epub file is a zip file. Check each file in the src zip file. If it is a css file, process by css_proc and write back to des. If not, copy to des ''' srcdir, fname = os.path.split(src) bookname, ext = os.path.splitext(fname) if not zf.is_zipfile(src): print fname + 'is not an epub book' print 'processing ' + bookname + '.' srczip = zf.ZipFile(src, 'r') deszip = zf.ZipFile(des, 'w', zf.ZIP_DEFLATED) flist = srczip.namelist() for f in flist: if f.endswith('.css'): if FORCE_REPLACE: deszip.write('style.css', f) else: srczip.extract(f, tmpdir) good2go = css_proc(os.path.join(tmpdir, f)) if good2go: deszip.write(os.path.join(tmpdir, f), f) else: deszip.write('style.css', f) else: data = srczip.read(f) deszip.writestr(f, data) srczip.close() deszip.close() def css_proc(css): #of = open(css,'a') #of.write('last line') #of.close() sheet = cssutils.parseFile(css) font_set = False lineheight_set = False #print sheet.cssText for rule in sheet: if rule.type == rule.FONT_FACE_RULE: for property in rule.style: if property.name == 'src': property.value = 'url(res:///system/fonts/zw.ttf), url(res:///media/fonts/zw.ttf), url(res:///sdcard/fonts/zw.ttf), url(res:///system/fonts/DroidSansFallback.ttf), url(c:/WINDOWS/Fonts/msyh.ttf)' font_set = True continue if rule.type == rule.STYLE_RULE and rule.selectorText == 'p': rule.style.setProperty('line-height','150%') rule.style.setProperty('margin-top','0') rule.style.setProperty('margin-bottom','0') lineheight_set = True #for property in rule.style: # if property.name == 'line-height': # property.value = '140%' # lineHeightSet = True # break of = open(css, 'w') of.write(sheet.cssText) of.close() return font_set and lineheight_set if __name__ == '__main__': cwddir = os.getcwd() if len(sys.argv) < 2: srcdir = os.path.join(cwddir, 'epub') else: srcdir = sys.argv[1] desdir = os.path.join(cwddir, 'epuboutput') tmpdir = os.path.join(cwddir, 'epubtmp') if not os.path.exists(desdir): os.mkdir(desdir) if not os.path.isdir(desdir): print 'Can not make destination folder' raise SystemExit if not os.path.exists(tmpdir): os.mkdir(tmpdir) if not os.path.isdir(tmpdir): print 'Can not make tmp folder' raise SystemExit if os.path.exists(srcdir): currsrcdir = srcdir currdesdir = desdir dirList=os.listdir(currsrcdir) for fname in dirList: if fname.endswith('.epub'): #print fname epub_proc(os.path.join(currsrcdir, fname), os.path.join(currdesdir, fname),tmpdir) else: print 'can not open ' + srcdir shutil.rmtree(tmpdir)
0 comments:
Post a Comment