Python使用zipfile模块时ZIP_STORED未定义的NameError问题咨询
为什么会出现
NameError: "global name 'ZIP_STORED' is not defined"? 这个问题我碰到过好多次啦!你遇到的错误原因其实很简单:你只导入了zipfile模块里的ZipFile类,但ZIP_STORED这个压缩模式常量并没有被导入到当前代码的命名空间中。
当你写from zipfile import ZipFile时,Python只会把ZipFile这一个类拉到当前的全局命名空间里,而zipfile模块里的其他内容(比如ZIP_STORED、ZIP_DEFLATED这些压缩模式常量)并不会自动被导入,所以直接用ZIP_STORED的时候,Python找不到它,自然就抛出NameError了。
两种解决方法
方法1:显式导入ZIP_STORED
修改你的导入语句,把ZIP_STORED也一起导入进来,这样就能直接使用它了:
from zipfile import ZipFile, ZIP_STORED from io import StringIO # 别忘了导入StringIO,不然这里也会报错哦 def compress(self, filename, data): inMemoryOutputFile = StringIO() zipFile = ZipFile(inMemoryOutputFile, 'w', ZIP_STORED) zipFile.writestr(filename, data) zipFile.close() inMemoryOutputFile.seek(0) return inMemoryOutputFile
方法2:通过模块名引用ZIP_STORED
如果你不想额外导入单个常量,可以直接导入整个zipfile模块,然后用zipfile.ZIP_STORED的方式来引用这个常量:
import zipfile from io import StringIO def compress(self, filename, data): inMemoryOutputFile = StringIO() zipFile = zipfile.ZipFile(inMemoryOutputFile, 'w', zipfile.ZIP_STORED) zipFile.writestr(filename, data) zipFile.close() inMemoryOutputFile.seek(0) return inMemoryOutputFile
总结一下:ZIP_STORED是zipfile模块专属的成员,不是Python内置的全局变量,必须通过显式导入或者模块名引用才能正常使用哦!
内容的提问来源于stack exchange,提问作者Tomislav Mikulin
相关产品推荐
相关产品推荐

