当我执行以下行时,我收到一条错误消息:
img = copy.deepcopy(img_file_obj)
The img_file_obj
有以下类型:
<class 'werkzeug.datastructures.FileStorage'>
难道不允许创建文件存储对象的深拷贝吗?
ADDED
我可能需要解释为什么我要尝试创建文件存储对象的副本。在我的代码末尾我执行:
img_obj.save(fname)
但在此之前我检查文件有多大。我通过以下方式做到这一点:
img_obj.seek(0, os.SEEK_END)
size = img.tell()
问题是检查大小会“破坏”文件。如果我检查文件大小然后保存它,我会在磁盘上得到一个空文件。这就是为什么我想创建文件对象的副本,检查副本的大小,如果大小可以接受,则将原始文件对象保存在磁盘上。
是否存在无法创建深拷贝的对象?
Yes.
任何类型覆盖标准的对象__deepcopy__
与(或注册copyreg https://docs.python.org/3/library/copyreg.html#module-copyreg) 引发异常的函数不能被深度复制。
其类型使用标准的任何对象__deepcopy__
但不能(浅)复制不能深复制。
任何具有子元素的对象(无论是否由标准选择)__deepcopy__
或其自己的实现)不能被深度复制的不能被深度复制。
而且有很多种对象甚至无法进行浅复制。的文档copy https://docs.python.org/3/library/copy.html模块给出了一些例子:
该模块不复制模块、方法、堆栈跟踪、堆栈帧、文件、套接字、窗口、数组或任何类似类型等类型。
并非如此不可能的复制文件,但它的含义相当模糊(它应该复制文件句柄,重新打开文件还是共享句柄?它应该以相同的文件指针开头吗?它的缓冲区或有状态编码器是否必须位于相同的状态?),因此使它们可复制只会产生误导而不是有帮助。
当然,Werkzeug 框架可以选择使其FileStorage
对象是可复制的,尽管标准 Python 文件对象不可复制,但它们可能出于同样的原因不这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)