(十二)Python 基于第三方庫的應(yīng)用舉例

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 第三方庫有 xlrdxlwt、xluntilspyExcelerator、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、xluntilspyExcelerator 可處理.xls 文件,網(wǎng)上的資源比較多。前兩者分別司職 讀和寫 ,后兩者 讀/寫 均可,但功能偏少。
    對于2007版以后的.xlsx 文件,則只有 openpyxlxlswriter 可以處理。其中,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)圖片查看器打開)
        

      python 圖片處理Pillow模塊的使用

    • 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.jpg
        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 減去像素的色彩后得到的新的色彩值。舉例如下:


        9.jpg

        反相效果圖invert.jpg
      • (4)、相減

        subtract(im1,im2)
        

        其求得的兩張圖片對應(yīng)的像素之差,用于采集相同背景圖片上的差異前景。舉例如下:


        8.jpg

        9.jpg

        相減效果subtract.jpg
        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')
        
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 黃昏 點(diǎn)亮一盞心燈 累了 你為我捶捶背 捏捏肩膀 無言的陪伴 于陽臺(tái)的一角 斜倚在藤椅上遠(yuǎn)望著天邊如血般的夕陽 煞...
    沈晏星閱讀 250評論 0 0
  • 他和她,從小一起長大。在他們生活的地方,有一座小山,他們總是喜歡在夜幕降臨,寂靜無人的時(shí)候,一起順著山道上山。...
    繁華落盡丶空白閱讀 395評論 0 0
  • 看了TED演講:一個(gè)人工資有多高,就看這一點(diǎn)。 主要講了如何讓別人認(rèn)可你的真正價(jià)值,并給出讓你滿意的薪酬? 內(nèi)容很...
    馮帆閱讀 6,544評論 14 135

友情鏈接更多精彩內(nèi)容