PIL image open 手动close
遇到代码报错,too many file open , 网上搜索后,知道是打开的file太多。对于这个问题可以通过两种方法解决。
第一种方法:修改最大允许打开文件数量
在linux上可以通过以下代码查看允许打开的最大文件个数
ulimit -a
可以通过以下代码修改这个最大数,如把最大允许打开的文件个数修改为5000
ulimit -n 5000
第二种方法:检查代码,对代码进行针对性修改
通过检查代码,找到了file open 过多的原因,PIL Image open打开了太多的图片
一般利用Image open 可以打开图片,不需要close,在适当时机自动关闭图片。
如下代码,实现了读取图片并进行转换为灰度图
from PIL import Image
import numpy as np
pic = Image.open('./bird.jpg')
pic_l = pic.convert("L")
程序不报错,并运行良好
现在,我们主动关闭图片后再执行转换操作,代码入下
from PIL import Image
import numpy as np
fp = open('./bird.jpg','rb')
pic = Image.open(fp)
fp.close()
pic_l = pic.convert("L")
运行出错
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-15-68cd0b54ad08> in <module>()4 pic = Image.open(fp)5 fp.close()
----> 6 pic_l = pic.convert("L")C:\Users\admin\Anaconda3\lib\site-packages\PIL\Image.py in convert(self, mode, matrix, dither, palette, colors)839 return self.copy()840
--> 841 self.load()842 843 if matrix:C:\Users\admin\Anaconda3\lib\site-packages\PIL\ImageFile.py in load(self)189 decoder = Image._getdecoder(self.mode, decoder_name,190 args, self.decoderconfig)
--> 191 seek(offset)192 try:193 decoder.setimage(self.im, extents)ValueError: seek of closed file
出错原因是convert需要调用ImageFile中的load函数。不光是convert,save也需要调用ImageFile中的load函数,在close后再对打开的图片进行save的话会报同样的错误。
为了减少pic file打开的数量,同时又可以对主动close后的pic 进行convert,save等操作。我们可以在close之前把pic转换为numpy array类型,代码如下
from PIL import Image
import numpy as np
fp = open('./bird.jpg','rb')
pic = Image.open(fp)
pic_array = np.array(pic) # Convert to numpy array
fp.close()
pic = Image.fromarray(pic_array) # convert to Image type
pic_l = pic.convert("L")
pic_l.show()
运行正常
总结:
主动关闭 Image open 后会使作用在pic上的部分方法失效,因此在关闭之前可以先保存为numpy array类型,再通过Image.fromarray读取图片,一定要在关闭之前保存,关闭之后保存,程序会报错。错误如下:
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
C:\Users\admin\Anaconda3\lib\site-packages\PIL\Image.py in fromarray(obj, mode)2166 typekey = (1, 1) + shape[2:], arr['typestr']
-> 2167 mode, rawmode = _fromarray_typemap[typekey]2168 except KeyError:KeyError: ((1, 1), '|O')During handling of the above exception, another exception occurred:TypeError Traceback (most recent call last)
<ipython-input-19-73b842ea9f66> in <module>()8 # fp.close()9 print(type(pic_array))
---> 10 pic = Image.fromarray(pic_array) # convert to Image type11 pic_l = pic.convert("L")12 pic_l.show()C:\Users\admin\Anaconda3\lib\site-packages\PIL\Image.py in fromarray(obj, mode)2168 except KeyError:2169 # print typekey
-> 2170 raise TypeError("Cannot handle this data type")2171 else:2172 rawmode = modeTypeError: Cannot handle this data type
虽然关闭之后也可以保存为numpy array 但是,在利用Image.fromarray 转换为Image格式时报错了。因此,一定要关闭之前保存为numpy array
PIL image open 手动close相关推荐
- 《Python数据可视化编程实战》—— 1.6 安装图像处理工具:Python图像库(PIL)...
本节书摘来异步社区<Python数据可视化编程实战>一书中的第1章,第1.6节,作者:[爱尔兰]Igor Milovanović,更多章节内容可以访问云栖社区"异步社区" ...
- No PIL installation found INFO:superset.utils.screenshots:No PIL installation found
pip 安装 superset 有时会出现该问题. No PIL installation found INFO:superset.utils.screenshots:No PIL installat ...
- numpy转PIL.Image: 处理Mask图像为单通道的彩色/灰度图colormap.png
文章目录 从分割数据集说起 8位彩色图 8位灰度图 1位二值图 什么是图像位深 PNG图像格式简介 如何处理Mask图像 注意!!!PIL一定要手动close 防止内存泄漏 PIL库相关函数 从分割数 ...
- python手动绘图_建筑师为什么要会python编程?
点击上方"ikuku消息"可以订阅哦! 作者: 马海东 时间: 20203.19 数字时代建筑师面临的问题 我们生存的这个时代是一个数字化的时代, 建筑师可以通过使用一系列与建筑设 ...
- fedora 20 PIL
今天安装PIL花了我好多的时间. 刚开始,我手动下载PIL原码,编译安装. 启动我的django项目,报下面的错误,完全不懂是么意思. CommandError: One or more models ...
- pythonpil模块安装_centos 安装python PIL模块
转载:https://www.cnblogs.com/ccdc/p/4069112.html 1.安装 使用yum安装缺少类库: #尤其重要,否则会报错 yum install python-deve ...
- pip工具使用总结以及常用库PIL、freetype的安装
pip工具安装使用 pip为python库软件管理工具pip docs 安装 wget https://bootstrap.pypa.io/ez_setup.py -O - | python 安装se ...
- pillow支持python 2和python 3_python3读取图像并可视化的方法(PIL/Pillow、opencv/cv2)...
原图: 使用TensorFlow做图像处理的时候,会对图像进行一些可视化的操作.下面,就来列举一些我知道的图像读取并可视化的方法. 1. Pillow模块 1.1 Pillow模块的前生 Pillow ...
- python输出文本对齐_python-使用PIL使文本居中对齐/居中对齐?
ImageDraw.text的PIL文档是一个很好的起点,但是请不要回答您的问题. 下面是一个如何将文本居中放置在任意边界框中而不是图像中心的示例. 边界框定义为:align='center' =左上 ...
最新文章
- Anaconda使用
- Vue.js 生命周期
- 资讯丨NVIDIA自造AI超级计算机:轻松进入世界前五
- 机房合作--gitee的使用
- DevExpress ASP.NET 使用经验谈(9)-Dev控件客户端事件 ClientSideEvents
- 设计模式--模板方法(Template Method)模式
- bzoj:3110: [Zjoi2013]K大数查询
- 导出测试点的信号名_小程序导出数据到excel表,借助云开发云函数实现excel数据的保存...
- rpc wmi 服务不可用_golang 基础(5) RPC
- sublime unable to save 没有那个文件或者目录
- 给Visual Studio Code的文件夹和文件替换图标
- [线性代数] 对网络上一篇讲解特征值分解的物理意义的文章的批注
- 【连载】如何掌握openGauss数据库核心技术?秘诀四:拿捏事务机制(1)
- 晶体封装越小esr越大_晶振
- linux shell学习三
- 【MEMORY ALIGN】内存对齐
- 今年的移动Pwn2own破解大赛:iPhone+安卓=50万美元
- Android控件开发之Gallery3D酷炫效果(带源码)
- 一篇文章学会er图绘制
- 二、GAMIT解算之数据准备
热门文章
- 如何排除网络故障1:常见的问题和解决这些问题的工具
- Harris 角点检测
- 计算机科学导论算绩点吗,这个应该可以计算通信大一期末的平均学分绩点吧。...
- 以京东为例,分析优惠价格叠加规则
- workon'提示'workon' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- maya水管转折_maya问题,怎么在曲线出添加管道?
- TouchSlide.1.1.js 参数
- Nero9到底想干什么啊?
- 《大数据建模、分析、挖掘技术》
- chocolatey 安装_如何为Windows安装和使用Chocolatey Package Manager?