]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Patch #1517891: Make 'a' create the file if it doesn't exist.
authorMartin v. Löwis <martin@v.loewis.de>
Tue, 13 Feb 2007 10:10:39 +0000 (10:10 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Tue, 13 Feb 2007 10:10:39 +0000 (10:10 +0000)
Fixes #1514451.

Doc/lib/libzipfile.tex
Lib/test/test_zipfile.py
Lib/zipfile.py
Misc/NEWS

index d3fca64df956c19367579094c31597c0dfb73510..06a236cef60bf70ea9c3d8b2366dce330e4792b7 100644 (file)
@@ -101,6 +101,8 @@ cat myzip.zip >> python.exe
 \end{verbatim}
 
   also works, and at least \program{WinZip} can read such files.
+  If \var{mode} is \code{a} and the file does not exist at all,
+  it is created.
   \var{compression} is the ZIP compression method to use when writing
   the archive, and should be \constant{ZIP_STORED} or
   \constant{ZIP_DEFLATED}; unrecognized values will cause
@@ -114,6 +116,9 @@ cat myzip.zip >> python.exe
   ZIP file would require ZIP64 extensions. ZIP64 extensions are disabled by
   default because the default \program{zip} and \program{unzip} commands on
   \UNIX{} (the InfoZIP utilities) don't support these extensions.
+
+  \versionchanged[If the file does not exist, it is created if the
+  mode is 'a']{2.6}
 \end{classdesc}
 
 \begin{methoddesc}{close}{}
index 2d206df5c32561fa736b4beb45b225ce7b35530a..c17039f2272c0655d5f8dc8c963878d73d961c71 100644 (file)
@@ -307,6 +307,28 @@ class PyZipFileTests(unittest.TestCase):
 
 
 class OtherTests(unittest.TestCase):
+    def testCreateNonExistentFileForAppend(self):
+        if os.path.exists(TESTFN):
+            os.unlink(TESTFN)
+            
+        filename = 'testfile.txt'
+        content = 'hello, world. this is some content.'
+        
+        try:
+            zf = zipfile.ZipFile(TESTFN, 'a')
+            zf.writestr(filename, content)
+            zf.close()
+        except IOError, (errno, errmsg):
+            self.fail('Could not append data to a non-existent zip file.')
+
+        self.assert_(os.path.exists(TESTFN))
+
+        zf = zipfile.ZipFile(TESTFN, 'r')
+        self.assertEqual(zf.read(filename), content)
+        zf.close()
+        
+        os.unlink(TESTFN)
+        
     def testCloseErroneousFile(self):
         # This test checks that the ZipFile constructor closes the file object
         # it opens if there's an error in the file.  If it doesn't, the traceback
index 93a0b75edb558cca8d55c4e4229842786d6f4c34..6e59242b328b491eb728d89a590b0b7e4f5df6b7 100644 (file)
@@ -396,7 +396,14 @@ class ZipFile:
             self._filePassed = 0
             self.filename = file
             modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'}
-            self.fp = open(file, modeDict[mode])
+            try:
+                self.fp = open(file, modeDict[mode])
+            except IOError:
+                if mode == 'a':
+                    mode = key = 'w'
+                    self.fp = open(file, modeDict[mode])
+                else:
+                    raise
         else:
             self._filePassed = 1
             self.fp = file
index 06ffc165d79ee9ba9eac16709c7befdbc4520d85..c6d3831b11af0228d4c0281228abaa5cb15701f4 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -128,6 +128,9 @@ Core and builtins
 Library
 -------
 
+- Patch #1517891: Mode 'a' for ZipFile now creates the file if it
+  doesn't exist.
+
 - Patch #698833: Support file decryption in zipfile.
 
 - Patch #685268: Consider a package's __path__ in imputil.