Python 語言功能強(qiáng)大的原因之一是有很多的第三方庫。無論是可以與 Matlab 媲美的專業(yè)數(shù)學(xué)計(jì)算,還是圖像處理,無論是大數(shù)據(jù)統(tǒng)計(jì)、計(jì)算機(jī)學(xué)習(xí),還是生物信息學(xué)研究,都可能找到開源的第三方類庫,而不必“重復(fù)發(fā)明輪子”。這些第三方庫主要可在 https://pypi.python.org/pypi 等站點(diǎn)找到。
-
一、對Excel的操作
常見的 Python 第三方庫有
xlrd、xlwt、xluntils、pyExcelerator、openpyxl、xlswriter等等,它們都可以跨平臺(tái)對 Excel 進(jìn)行操作,不需要在系統(tǒng)中安裝 Office 辦公軟件。此外,在Windows操作系統(tǒng)中,Python 還可以利用 win32com 調(diào)用系統(tǒng)中已安裝的 Office 辦公軟件對 Excel 進(jìn)行操作。
其中xlrd、xlwt、xluntils和pyExcelerator可處理.xls文件,網(wǎng)上的資源比較多。前兩者分別司職 讀和寫 ,后兩者 讀/寫 均可,但功能偏少。
對于2007版以后的.xlsx文件,則只有openpyxl和xlswriter可以處理。其中,xlswriter對.xlsx文件的操作功能非常專業(yè),單元格格式設(shè)置、合并、數(shù)據(jù)有效性、圖標(biāo)、公式、宏等操作幾乎應(yīng)有盡有,美中不足的是沒有讀取功能。而openpyxl雖然功能不夠強(qiáng)大,但 讀/寫 均可,能滿足基本的操作要求。下面以openpyxl為例進(jìn)行介紹。 -
1.1、用 openpyxl 在內(nèi)存中創(chuàng)建工作表
在互聯(lián)網(wǎng)狀態(tài)下,安裝 openpyxl 庫(不會(huì)安裝庫的聯(lián)系我或者百度)。首先在內(nèi)存中創(chuàng)建工作表,或?qū)⒁延泄ぷ鞅硌b入內(nèi)存,例如:
from openpyxl import Workbook wb = Workbook() wb.save('/Users/wangchong/Desktop/test.xlsx') # 在桌面建立test.xlsx的表格 -
1.2、數(shù)據(jù)的讀取
使用 openpyxl 可以直接訪問活動(dòng)工作表的單元格,如下:
cell_A4 = ws['A4']這里,
cell_A4對象實(shí)例的類型是單元格,其值為cell_A4.value。也可以直接執(zhí)行、列定位訪問單元格,讀取數(shù)據(jù)或賦值,例如:cell_B4 = ws.cell(row=4,column=2,value='上海市')注意:這里的行、列參數(shù)row和column 都是從1開始的,與Python 其他對象的指針下標(biāo)不一致。
如果要遍歷整個(gè)工作表的所有單元格,可以使用 openpyxl.worksheet.Worksheet.rows()方法,將其用tuple()函數(shù)轉(zhuǎn)換為元組類型,即可得到每行元組為元素的二維元組。同樣,使用openpyxl.worksheet.Worksheet.columns()方法,將其用tuple()函數(shù)轉(zhuǎn)換為元組類型,即可得到每列元組為元素的二維元組。
如果需要讀取工作表中的部分?jǐn)?shù)據(jù),則可以使用單元格區(qū)間、列區(qū)間和行區(qū)間,例如:cell_range = ws['A1:C2']、col_range = ws['C:D']和row_range=['5:10']。openpyxl 并沒有提供獲取有效行數(shù)和列數(shù)的函數(shù),但可以使用 len() 函數(shù)獲取。有效行數(shù)為 len(tuple(ws.rows)),有效列數(shù)為 len(tuple(ws.columns))。 -
二、圖片操作
PIL (Python Imaging Library) 是著名的圖片處理的第三方,包含基本的圖像處理、特效合成、濾鏡等方法。其替代庫 Pillow 修復(fù)了 PIL 的一些缺陷,提供了 Python3的支持。在鏈接互聯(lián)網(wǎng)的狀態(tài)下,安裝 Pillow庫。Pillow庫中除核心模塊 Image外,還包含 ImageChops(圖片計(jì)算)、ImageEnhance(圖片效果)、ImageFilter(濾鏡)、ImageDraw(繪圖) 等主要模塊。
-
2.1、Image 模塊及應(yīng)用
Image 模塊中常用的函數(shù)如下。-
(1) 圖片打開函數(shù)
.open(file,openmode)其中,參數(shù)file和openmode 分別為文件名和打開方式(默認(rèn)為
'r',只讀)。 -
(2) 新建圖片函數(shù)
new(mode,size,color=0)其中,mode為圖片色彩模式,取值為:'RGB'、'CMYK'、'LAB'等等。size為圖片的大小,是由水平像素?cái)?shù)與垂直像素?cái)?shù)組成的元組;color為顏色,默認(rèn)顏色為黑色(0)。
-
(3) 復(fù)制圖片函數(shù)
copy()功能是將圖片的對象復(fù)制到內(nèi)存中。
-
(4) 粘貼圖片函數(shù)
paste(region.size)功能是將內(nèi)存中的圖片粘貼到對象region 中,其中,region 為粘貼對象,size為圖片大小。
-
(5) 顯示圖片
show()功能是顯示內(nèi)存中的圖片。
-
(6) 重新設(shè)置大小
resize(size)其中,size為圖片的大小,是水平像素與垂直像素元組。
-
(7) 圖片旋轉(zhuǎn)
rotate(angle)其中,angle是旋轉(zhuǎn)的角度。
-
(8) 圖片變換
transpose(method)其中,method可選項(xiàng)有:FLIP_LEFT_RIGHT(左右鏡像)、FLIP_TOP_BOTTOM(上下鏡像)、ROTATE_90(順時(shí)針 90°)、ROTATE_180(順時(shí)針 180°)、ROTATE_270(逆時(shí)針 90°)等。
-
(9) 圖片裁剪
copy((x1,y1,x2,y2))其中,各參數(shù)為自左上角點(diǎn)至右下角點(diǎn)的坐標(biāo)元組。
-
(10) 縮略圖
thumbnail(size)其中,size為縮略圖大小。
-
(11) 轉(zhuǎn)換函數(shù)
convert(mode)功能是轉(zhuǎn)換色彩模式。其中,mode可取值為:L、RGB、CMYK等等。
-
(12) 混合圖片函數(shù)
blend(im1,im2,alpha)其中,im1,im2 分別相當(dāng)于 Photoshop 中參加混合的上、下兩層圖片;alpha 為混合透明度,通過 im1*(1-alpha)+im2*alpha 得到混合結(jié)果。
-
(13) 遮罩圖片函數(shù)
composite(im1,im2,mask)其中,im1 相當(dāng)于 Photoshop 中的綁定遮罩層的圖片;im2相當(dāng)于下層圖片(被遮罩);mask 為遮罩層圖片,要求為黑白二值、灰度或RGBA色彩模式。
-
(14) 保存圖片
save(file,format)功能是將內(nèi)存中的圖片寫入文件中。
-
例如:在桌面
/Users/wangchong/Desktop/testImage文件夾中畫一個(gè)藍(lán)底的圖片,圖片中有一個(gè)紅色的圓,效果如下所示:
#! coding=utf-8 from PIL import Image from PIL import ImageDraw path="/Users/wangchong/Desktop/testImage/1.jpg" #文件存儲(chǔ)的路徑 image=Image.new("RGB",(200,200),"blue")#創(chuàng)建一個(gè)藍(lán)色的,大小為200*200像素的RGB圖片 drawObject=ImageDraw.Draw(image) drawObject.ellipse((50,50,80,80),fill="red")#在image上畫一個(gè)紅色的圓 image.save(path)#保存圖片 """以下代碼用來顯示出畫的圖片""" img=Image.open(path) img.show()#標(biāo)準(zhǔn)版本的show()方法不是很有效率,因?yàn)樗葘D像保存為一個(gè)臨時(shí)文件,然后使用xv進(jìn)行顯示。如果沒有安裝xv,該函數(shù)甚至不能工作。但是該方法非常便于debug和test。(windows中應(yīng)該調(diào)用默認(rèn)圖片查看器打開)
-
-
2.2、ImageChops 特效與合成
ImageChops 模塊包含一些通過計(jì)算圖片通道中的像素值而進(jìn)行特效合成的函數(shù),相當(dāng)于 Photoshop 中的圖層特效。常見的特效函數(shù)如下。
-
(1)、正片疊底
mutiply(im1,im2)這類似于在同一光源疊放兩張膠片的投影效果,高亮度視為透明。舉例如下:
6.jpg
7.jpg
正片疊底合成效果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)這類似于兩張膠片分別透過不同光源在同一屏幕上的投影結(jié)果,低亮度視為透明。舉例如下:
8.jpg
9.jpg
濾色效果screen.jpgfrom 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 減去像素的色彩后得到的新的色彩值。舉例如下:
9.jpg
反相效果圖invert.jpg -
(4)、相減
subtract(im1,im2)其求得的兩張圖片對應(yīng)的像素之差,用于采集相同背景圖片上的差異前景。舉例如下:
8.jpg
9.jpg
相減效果subtract.jpgfrom 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')
-
-











