[Python-checkins] r67946 - in python/trunk: Doc/library/zipfile.rst Lib/test/test_zipfile.py Lib/zipfile.py Misc/NEWS

antoine.pitrou python-checkins at python.org
Sat Dec 27 16:43:14 CET 2008


Author: antoine.pitrou
Date: Sat Dec 27 16:43:12 2008
New Revision: 67946
Log:
Issue #4756: zipfile.is_zipfile() now supports file-like objects.
Patch by Gabriel Genellina.
Modified:
 python/trunk/Doc/library/zipfile.rst
 python/trunk/Lib/test/test_zipfile.py
 python/trunk/Lib/zipfile.py
 python/trunk/Misc/NEWS
Modified: python/trunk/Doc/library/zipfile.rst
==============================================================================
--- python/trunk/Doc/library/zipfile.rst	(original)
+++ python/trunk/Doc/library/zipfile.rst	Sat Dec 27 16:43:12 2008
@@ -66,9 +66,11 @@
 .. function:: is_zipfile(filename)
 
 Returns ``True`` if *filename* is a valid ZIP file based on its magic number,
- otherwise returns ``False``. This module does not currently handle ZIP files
- which have appended comments.
+ otherwise returns ``False``. *filename* may be a file or file-like object too.
+ This module does not currently handle ZIP files which have appended comments.
 
+ .. versionchanged:: 2.7
+ Support for file and file-like objects.
 
 .. data:: ZIP_STORED
 
Modified: python/trunk/Lib/test/test_zipfile.py
==============================================================================
--- python/trunk/Lib/test/test_zipfile.py	(original)
+++ python/trunk/Lib/test/test_zipfile.py	Sat Dec 27 16:43:12 2008
@@ -634,20 +634,49 @@
 def testIsZipErroneousFile(self):
 # This test checks that the is_zipfile function correctly identifies
 # a file that is not a zip file
- fp = open(TESTFN, "w")
- fp.write("this is not a legal zip file\n")
- fp.close()
+
+ # - passing a filename
+ with open(TESTFN, "w") as fp:
+ fp.write("this is not a legal zip file\n")
 chk = zipfile.is_zipfile(TESTFN)
- self.assert_(chk is False)
+ self.assert_(not chk)
+ # - passing a file object
+ with open(TESTFN, "rb") as fp:
+ chk = zipfile.is_zipfile(fp)
+ self.assert_(not chk)
+ # - passing a file-like object
+ fp = StringIO()
+ fp.write("this is not a legal zip file\n")
+ chk = zipfile.is_zipfile(fp)
+ self.assert_(not chk)
+ fp.seek(0,0)
+ chk = zipfile.is_zipfile(fp)
+ self.assert_(not chk)
 
 def testIsZipValidFile(self):
 # This test checks that the is_zipfile function correctly identifies
 # a file that is a zip file
+
+ # - passing a filename
 zipf = zipfile.ZipFile(TESTFN, mode="w")
 zipf.writestr("foo.txt", "O, for a Muse of Fire!")
 zipf.close()
 chk = zipfile.is_zipfile(TESTFN)
- self.assert_(chk is True)
+ self.assert_(chk)
+ # - passing a file object
+ with open(TESTFN, "rb") as fp:
+ chk = zipfile.is_zipfile(fp)
+ self.assert_(chk)
+ fp.seek(0,0)
+ zip_contents = fp.read()
+ # - passing a file-like object
+ fp = StringIO()
+ fp.write(zip_contents)
+ chk = zipfile.is_zipfile(fp)
+ self.assert_(chk)
+ fp.seek(0,0)
+ chk = zipfile.is_zipfile(fp)
+ self.assert_(chk)
 
 def testNonExistentFileRaisesIOError(self):
 # make sure we don't raise an AttributeError when a partially-constructed
Modified: python/trunk/Lib/zipfile.py
==============================================================================
--- python/trunk/Lib/zipfile.py	(original)
+++ python/trunk/Lib/zipfile.py	Sat Dec 27 16:43:12 2008
@@ -128,18 +128,30 @@
 _CD64_DIRECTORY_SIZE = 8
 _CD64_OFFSET_START_CENTDIR = 9
 
-def is_zipfile(filename):
- """Quickly see if file is a ZIP file by checking the magic number."""
+def _check_zipfile(fp):
 try:
- fpin = open(filename, "rb")
- endrec = _EndRecData(fpin)
- fpin.close()
- if endrec:
- return True # file has correct magic number
+ if _EndRecData(fp):
+ return True # file has correct magic number
 except IOError:
 pass
 return False
 
+def is_zipfile(filename):
+ """Quickly see if a file is a ZIP file by checking the magic number.
+
+ The filename argument may be a file or file-like object too.
+ """
+ result = False
+ try:
+ if hasattr(filename, "read"):
+ result = _check_zipfile(fp=filename)
+ else:
+ with open(filename, "rb") as fp:
+ result = _check_zipfile(fp)
+ except IOError:
+ pass
+ return result
+
 def _EndRecData64(fpin, offset, endrec):
 """
 Read the ZIP64 end-of-archive records and use that to update endrec
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Sat Dec 27 16:43:12 2008
@@ -86,6 +86,9 @@
 Library
 -------
 
+- Issue #4756: zipfile.is_zipfile() now supports file-like objects. Patch by
+ Gabriel Genellina.
+
 - Issue #4400: .pypirc default generated file was broken in distutils.
 
 - Issue #4736: io.BufferedRWPair's closed property now functions properly.


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /