有人能解释以下这个谜团吗?
我创建了一个约37[MB]大小的二进制文件。在Ubuntu终端中压缩它只需要不到1秒钟的时间。然后我尝试了Python:使用zipfile模块进行编程压缩也大约需要1秒钟的时间。
然后我尝试解压缩我创建的zip文件。在Ubuntu终端中,这只需要不到1秒钟的时间。
在Python中,解压缩的代码(使用zipfile模块)运行需要接近37秒钟的时间!有什么想法吗?
有人能解释以下这个谜团吗?
我创建了一个约37[MB]大小的二进制文件。在Ubuntu终端中压缩它只需要不到1秒钟的时间。然后我尝试了Python:使用zipfile模块进行编程压缩也大约需要1秒钟的时间。
然后我尝试解压缩我创建的zip文件。在Ubuntu终端中,这只需要不到1秒钟的时间。
在Python中,解压缩的代码(使用zipfile模块)运行需要接近37秒钟的时间!有什么想法吗?
我曾经也遇到过使用Python解压/解压缩/提取zip文件的困难,那种“创建ZipFile对象,循环遍历其.namelist(),读取文件并将其写入文件系统”的低级方法似乎不太符合Python的风格。因此,我开始研究zipfile对象,但我发现其文档不是很完整,并且没有涵盖所有对象方法:
>>> from zipfile import ZipFile
>>> filepath = '/srv/pydocfiles/packages/ebook.zip'
>>> zip = ZipFile(filepath)
>>> dir(zip)
['NameToInfo', '_GetContents', '_RealGetContents', '__del__', '__doc__', '__enter__', '__exit__', '__init__', '__module__', '_allowZip64', '_didModify', '_extract_member', '_filePassed', '_writecheck', 'close', 'comment', 'compression', 'debug', 'extract', 'extractall', 'filelist', 'filename', 'fp', 'getinfo', 'infolist', 'mode', 'namelist', 'open', 'printdir', 'pwd', 'read', 'setpassword', 'start_dir', 'testzip', 'write', 'writestr']
这里我们使用的"extractall"方法与tarfile的extractall方法非常相似!(适用于Python 2.6和2.7,但不适用于2.5)
然后是性能问题;文件ebook.zip大小为84.6 MB(大部分为pdf文件),未压缩的文件夹大小为103 MB,在MacOSx 10.5下默认使用"Archive Utility"进行压缩。因此,我使用了Python的timeit模块进行了相同的操作:
>>> from timeit import Timer
>>> t = Timer("filepath = '/srv/pydocfiles/packages/ebook.zip'; \
... extract_to = '/tmp/pydocnet/build'; \
... from zipfile import ZipFile; \
... ZipFile(filepath).extractall(path=extract_to)")
>>>
>>> t.timeit(1)
1.8670060634613037
在一个已经被其它应用程序占用了90%内存的重负载机器上,只需不到2秒钟就能完成。
希望这对某些人有所帮助。
我不知道你用什么代码来解压缩文件,但是以下代码对我有效:在创建一个只包含一个文件“file1”的zip归档文件“test.zip”之后,下面的Python脚本从归档中提取“file1”:
from zipfile import ZipFile, ZIP_DEFLATED
zip = ZipFile("test.zip", mode='r', compression=ZIP_DEFLATED, allowZip64=False)
data = zip.read("file1")
print len(data)
我们可以使用Ubuntu在Python中提供的zip功能而不是使用Python模块。我会使用这个功能,因为有时Python的zip会失败。
import os
filename = test
os.system('7z a %s.zip %s'% (filename, filename))
str.format()
而不是%格式化,例如os.system('7z a {0}.zip {0}'.format(filename))
。正如他们在文档中提到的那样,它将来会被移除,我相信它已经在3+中被移除了。 - thegrinnerimport subprocess; subprocess.call(['7z', 'a', filename+'.zip', filename])
。如果文件名包含空格或换行符会发生什么? - glglgl