Python 语言功能强大的原因之一是有很多的第三方库。无论是可以与 Matlab 媲美的专业数学计算,还是图像处理,无论是大数据统计、计算机学习,还是生物信息学研究,都可能找到开源的第三方类库,而不必“重复发明轮子”。这些第三方库主要可在 https://pypi.python.org/pypi 等站点找到。
-
一、对Excel的操作
常见的 Python 第三方库有
xlrd
、xlwt
、xluntils
、pyExcelerator
、openpyxl
、xlswriter
等等,它们都可以跨平台对 Excel 进行操作,不需要在系统中安装 Office 办公软件。此外,在Windows操作系统中,Python 还可以利用 win32com 调用系统中已安装的 Office 办公软件对 Excel 进行操作。
其中xlrd
、xlwt
、xluntils
和pyExcelerator
可处理.xls
文件,网上的资源比较多。前两者分别司职 读和写 ,后两者 读/写 均可,但功能偏少。
对于2007版以后的.xlsx
文件,则只有openpyxl
和xlswriter
可以处理。其中,xlswriter
对.xlsx
文件的操作功能非常专业,单元格格式设置、合并、数据有效性、图标、公式、宏等操作几乎应有尽有,美中不足的是没有读取功能。而openpyxl
虽然功能不够强大,但 读/写 均可,能满足基本的操作要求。下面以openpyxl
为例进行介绍。 -
1.1、用 openpyxl 在内存中创建工作表
在互联网状态下,安装 openpyxl 库(不会安装库的联系我或者百度)。首先在内存中创建工作表,或将已有工作表装入内存,例如:
from openpyxl import Workbook wb = Workbook() wb.save('/Users/wangchong/Desktop/test.xlsx') # 在桌面建立test.xlsx的表格
-
1.2、数据的读取
使用 openpyxl 可以直接访问活动工作表的单元格,如下:
cell_A4 = ws['A4']
这里,
cell_A4
对象实例的类型是单元格,其值为cell_A4.value
。也可以直接执行、列定位访问单元格,读取数据或赋值,例如:cell_B4 = ws.cell(row=4,column=2,value='上海市')
注意:这里的行、列参数row和column 都是从1开始的,与Python 其他对象的指针下标不一致。
如果要遍历整个工作表的所有单元格,可以使用 openpyxl.worksheet.Worksheet.rows()方法,将其用tuple()函数转换为元组类型,即可得到每行元组为元素的二维元组。同样,使用openpyxl.worksheet.Worksheet.columns()方法,将其用tuple()函数转换为元组类型,即可得到每列元组为元素的二维元组。
如果需要读取工作表中的部分数据,则可以使用单元格区间、列区间和行区间,例如:cell_range = ws['A1:C2']、col_range = ws['C:D']和row_range=['5:10']。openpyxl 并没有提供获取有效行数和列数的函数,但可以使用 len() 函数获取。有效行数为 len(tuple(ws.rows)),有效列数为 len(tuple(ws.columns))。 -
二、图片操作
PIL (Python Imaging Library) 是著名的图片处理的第三方,包含基本的图像处理、特效合成、滤镜等方法。其替代库 Pillow 修复了 PIL 的一些缺陷,提供了 Python3的支持。在链接互联网的状态下,安装 Pillow库。Pillow库中除核心模块 Image外,还包含 ImageChops(图片计算)、ImageEnhance(图片效果)、ImageFilter(滤镜)、ImageDraw(绘图) 等主要模块。
-
2.1、Image 模块及应用
Image 模块中常用的函数如下。-
(1) 图片打开函数
.open(file,openmode)
其中,参数file和openmode 分别为文件名和打开方式(默认为
'r'
,只读)。 -
(2) 新建图片函数
new(mode,size,color=0)
其中,mode为图片色彩模式,取值为:'RGB'、'CMYK'、'LAB'等等。size为图片的大小,是由水平像素数与垂直像素数组成的元组;color为颜色,默认颜色为黑色(0)。
-
(3) 复制图片函数
copy()
功能是将图片的对象复制到内存中。
-
(4) 粘贴图片函数
paste(region.size)
功能是将内存中的图片粘贴到对象region 中,其中,region 为粘贴对象,size为图片大小。
-
(5) 显示图片
show()
功能是显示内存中的图片。
-
(6) 重新设置大小
resize(size)
其中,size为图片的大小,是水平像素与垂直像素元组。
-
(7) 图片旋转
rotate(angle)
其中,angle是旋转的角度。
-
(8) 图片变换
transpose(method)
其中,method可选项有:FLIP_LEFT_RIGHT(左右镜像)、FLIP_TOP_BOTTOM(上下镜像)、ROTATE_90(顺时针 90°)、ROTATE_180(顺时针 180°)、ROTATE_270(逆时针 90°)等。
-
(9) 图片裁剪
copy((x1,y1,x2,y2))
其中,各参数为自左上角点至右下角点的坐标元组。
-
(10) 缩略图
thumbnail(size)
其中,size为缩略图大小。
-
(11) 转换函数
convert(mode)
功能是转换色彩模式。其中,mode可取值为:L、RGB、CMYK等等。
-
(12) 混合图片函数
blend(im1,im2,alpha)
其中,im1,im2 分别相当于 Photoshop 中参加混合的上、下两层图片;alpha 为混合透明度,通过 im1*(1-alpha)+im2*alpha 得到混合结果。
-
(13) 遮罩图片函数
composite(im1,im2,mask)
其中,im1 相当于 Photoshop 中的绑定遮罩层的图片;im2相当于下层图片(被遮罩);mask 为遮罩层图片,要求为黑白二值、灰度或RGBA色彩模式。
-
(14) 保存图片
save(file,format)
功能是将内存中的图片写入文件中。
-
例如:在桌面
/Users/wangchong/Desktop/testImage
文件夹中画一个蓝底的图片,图片中有一个红色的圆,效果如下所示:
#! coding=utf-8 from PIL import Image from PIL import ImageDraw path="/Users/wangchong/Desktop/testImage/1.jpg" #文件存储的路径 image=Image.new("RGB",(200,200),"blue")#创建一个蓝色的,大小为200*200像素的RGB图片 drawObject=ImageDraw.Draw(image) drawObject.ellipse((50,50,80,80),fill="red")#在image上画一个红色的圆 image.save(path)#保存图片 """以下代码用来显示出画的图片""" img=Image.open(path) img.show()#标准版本的show()方法不是很有效率,因为它先将图像保存为一个临时文件,然后使用xv进行显示。如果没有安装xv,该函数甚至不能工作。但是该方法非常便于debug和test。(windows中应该调用默认图片查看器打开)
python 图片处理Pillow模块的使用
-
-
2.2、ImageChops 特效与合成
ImageChops 模块包含一些通过计算图片通道中的像素值而进行特效合成的函数,相当于 Photoshop 中的图层特效。常见的特效函数如下。
-
(1)、正片叠底
mutiply(im1,im2)
这类似于在同一光源叠放两张胶片的投影效果,高亮度视为透明。举例如下:
from PIL import Image from PIL import ImageChops im1 = Image.open('/Users/wangchong/Desktop/testImage/6.jpg') im2 = Image.open('/Users/wangchong/Desktop/testImage/7.jpg') m = ImageChops.multiply(im1,im2) m.show() m.save('/Users/wangchong/Desktop/testImage/multiply.jpg')
-
(2)、滤色
screen(im1,im2)
这类似于两张胶片分别透过不同光源在同一屏幕上的投影结果,低亮度视为透明。举例如下:
from PIL import Image from PIL import ImageChops im1 = Image.open('/Users/wangchong/Desktop/testImage/8.jpg') im2 = Image.open('/Users/wangchong/Desktop/testImage/9.jpg') m = ImageChops.screen(im1,im2) m.show() m.save('/Users/wangchong/Desktop/testImage/screen.jpg')
-
(3)、反相
invert(im1)
这类似于照片底片的效果,以 255 减去像素的色彩后得到的新的色彩值。举例如下:
-
(4)、相减
subtract(im1,im2)
其求得的两张图片对应的像素之差,用于采集相同背景图片上的差异前景。举例如下:
from PIL import Image from PIL import ImageChops im1 = Image.open('/Users/wangchong/Desktop/testImage/8.jpg') im2 = Image.open('/Users/wangchong/Desktop/testImage/9.jpg') m = ImageChops.subtract(im1,im2) m.show() m.save('/Users/wangchong/Desktop/testImage/subtract.jpg')
-
-