RE: Copying a ZipExtFile
On October 28, 2009 8:33 PM, ryles wrote: snip with io.BytesIO() as memio: shutil.copyfileobj(f, memio) zip = zipfile.ZipFile(file=memio) # Can't use zip.extract(), because I want to ignore paths # within archive. src = zip.open('unknowndir/src.txt') with open('dst.txt', mode='wb') as dst: shutil.copyfileobj(src, dst) The last line throws an Error: Traceback (most recent call last): File test.py, line 25, in module shutil.copyfileobj(src, dst) File C:\Python26\lib\shutil.py, line 27, in copyfileobj buf = fsrc.read(length) File C:\Python26\lib\zipfile.py, line 594, in read bytes = self.fileobj.read(bytesToRead) TypeError: integer argument expected, got 'long' It should hopefully work if you use cStringIO/StringIO instead of BytesIO. It does! Excellent! You've saved me the trouble of a weekend debug session. --Matt -- http://mail.python.org/mailman/listinfo/python-list
RE: Copying a ZipExtFile
En Fri, 23 Oct 2009 14:15:33 -0300, Moore, Mathew L moor...@battelle.org escribió: with io.BytesIO() as memio: shutil.copyfileobj(f, memio) zip = zipfile.ZipFile(file=memio) # Can't use zip.extract(), because I want to ignore paths # within archive. src = zip.open('unknowndir/src.txt') with open('dst.txt', mode='wb') as dst: shutil.copyfileobj(src, dst) The last line throws an Error: Traceback (most recent call last): File test.py, line 25, in module shutil.copyfileobj(src, dst) File C:\Python26\lib\shutil.py, line 27, in copyfileobj buf = fsrc.read(length) File C:\Python26\lib\zipfile.py, line 594, in read bytes = self.fileobj.read(bytesToRead) TypeError: integer argument expected, got 'long' Try adding a length parameter to the copyfileobj call, so the copy is done in small enough chunks. Hmmm...tried a variety of lengths (512, 1024, etc.) with no luck. Maybe this is a good opportunity for me to learn some Python debugging tools. Thanks! --Matt -- http://mail.python.org/mailman/listinfo/python-list
Copying a ZipExtFile
Hello all, A newbie here. I was wondering why the following fails on Python 2.6.2 (r262:71605) on win32. Am I doing something inappropriate? Interestingly, it works in 3.1, but would like to also get it working in 2.6. Thanks in advance, --Matt import io import shutil import tempfile import zipfile with tempfile.TemporaryFile() as f: # (Real code retrieves archive via urllib2.urlopen().) zip = zipfile.ZipFile(f, mode='w') zip.writestr('unknowndir/src.txt', 'Hello, world!') zip.close(); # (Pretend we just downloaded the zip file.) f.seek(0) # Result of urlopen() is not seekable, but ZipFile requires a # seekable file. Work around this by copying the file into a # memory stream. with io.BytesIO() as memio: shutil.copyfileobj(f, memio) zip = zipfile.ZipFile(file=memio) # Can't use zip.extract(), because I want to ignore paths # within archive. src = zip.open('unknowndir/src.txt') with open('dst.txt', mode='wb') as dst: shutil.copyfileobj(src, dst) The last line throws an Error: Traceback (most recent call last): File test.py, line 25, in module shutil.copyfileobj(src, dst) File C:\Python26\lib\shutil.py, line 27, in copyfileobj buf = fsrc.read(length) File C:\Python26\lib\zipfile.py, line 594, in read bytes = self.fileobj.read(bytesToRead) TypeError: integer argument expected, got 'long' -- http://mail.python.org/mailman/listinfo/python-list