Дамјан Георгиевски wrote:
I'm writing a script that should modify ODF files. ODF files are just
.zip archives with some .xml files, images etc.

So far I open the zip file and play with the xml with lxml.etree, but
I can't replace the files in it.

Is there some recipe that does this ?

I ended writing this, pretty specific subclass of ZipFile....

Careful, you might get surprised.  Suppose you have this archive:
    z = zipfile.ZipFile('bumble.zip', 'w')
    z.writestr('one.xml', '<text>Frankly, my dear,</text>')
    z.writestr('two.xml', "<text>I don't give a damn.</text>")
    z.writestr('one.xml', '<text>Frankly, Scarlett, </text>')
    z.close()

Note what you get if, after executing the above, you execute:
    rz = zipfile.ZipFile('bumble.zip', 'w')
    print rz.read('one.xml'), rz.read('two.xml')
    rz.close()

If you use your code to replace 'one.xml', because of the .pop
you'll wind up with the equivalent of:
    nz = zipfile.ZipFile('other.zip', 'w')
    nz.writestr('one.xml', '<text>new tree output</text>')
    nz.writestr('two.xml', "<text>I don't give a damn.</text>")
    nz.writestr('one.xml', '<text>Frankly, Scarlett, </text>')
    nz.close()

Which will produce the same output as the original, confounding
your user.  You could just write the new values out, since .read
picks the last entry (as I believe it should).  Alternatively, if
you want to replace it "in place", you'll need a bit more smarts
when there is more than one copy of a file in the archive (when
z.namelist.count(filename) > 1).

--Scott David Daniels
scott.dani...@acm.org
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to