title: Python remove entry from zipfile
body: <p>I'm currently writing an open source library for a container format, which involves modifying zip archives. Therefore I utilized pythons build-in zipfile module. Due to some limitations I decided to modify the module and ship it with my library. These modifications include a patch for removing entries from the zip file from the python issue tracker: <a href="https://bugs.python.org/issue6818" rel="nofollow">https://bugs.python.org/issue6818</a>
  To be more specific I included the <code>zipfile.remove.2.patch</code> from ubershmekel.
  After some modifications for Python-2.7 the patch works just fine according to the shipped unit-tests.</p>
  
  <p>But nevertheless I'm running into some problems, when removing, adding and removing + adding files without closing the zipfile in between.</p>
  
  <pre><code>Error
  Traceback (most recent call last):
    File "/home/martin/git/pyCombineArchive/tests/test_zipfile.py", line 1590, in test_delete_add_no_close
      self.assertEqual(zf.read(fname), data)
    File "/home/martin/git/pyCombineArchive/combinearchive/custom_zip.py", line 948, in read
      with self.open(name, "r", pwd) as fp:
    File "/home/martin/git/pyCombineArchive/combinearchive/custom_zip.py", line 1003, in open
      % (zinfo.orig_filename, fname))
  BadZipFile: File name in directory 'foo.txt' and header 'bar.txt' differ.
  </code></pre>
  
  <p>Meaning the zip file is ok, but somehow the central dictionary/entry header gets messed up.
  This unittest reproduces this error:</p>
  
  <pre><code>def test_delete_add_no_close(self):
      fname_list = ["foo.txt", "bar.txt", "blu.bla", "sup.bro", "rollah"]
      data_list = [''.join([chr(randint(0, 255)) for i in range(100)]) for i in range(len(fname_list))]
  
      # add some files to the zip
      with zipfile.ZipFile(TESTFN, "w") as zf:
          for fname, data in zip(fname_list, data_list):
              zf.writestr(fname, data)
  
      for no in range(0, 2):
          with zipfile.ZipFile(TESTFN, "a") as zf:
              zf.remove(fname_list[no])
              zf.writestr(fname_list[no], data_list[no])
              zf.remove(fname_list[no+1])
              zf.writestr(fname_list[no+1], data_list[no+1])
  
              # try to access prior deleted/added file and prior last file (which got moved, while delete)
              for fname, data in zip(fname_list, data_list):
                  self.assertEqual(zf.read(fname), data)
  </code></pre>
  
  <p>My modified zipfile module and the complete unittest file can be found in this gist: <a href="https://gist.github.com/FreakyBytes/30a6f9866154d82f1c3863f2e4969cc4" rel="nofollow">https://gist.github.com/FreakyBytes/30a6f9866154d82f1c3863f2e4969cc4</a></p>