前言
Excel文件有兩種常見的格式分別是xls和xlsx,這兩種格式的Excel文件最大的不同之處在於,xls格式的每個表(Sheet)最多只能有65536行和256列,而xlsx則最多可以有1048576行和16384列。上一篇文章講解了如何讀寫xls格式的Excel文件,這篇文章中,小編將演示如何使用openpyxl包(安裝命令:pip3 install openpyxl),完成 xlsx格式的Excel文件的簡單讀寫任務。其中,關於「工作簿(workbook)」和工作表(Sheet)之間的關係,請查看「2.4 xls格式的Excel文件讀寫——xlrd、xlwt」,關於如何安裝Python包,請查看「1.1Python開發環境的搭建」。
openpyxl包使用簡介
下表中歸納了一個Excel的操作流程中常用的函數方法,其中,如果創建工作簿後,設定工作簿的屬性guess_types為True(即workbook.guess_types = True),則數據寫入Excel中時,會自動猜測數據的類型,對於小數會作一定的四捨五入處理,具體請看下文中的示例代碼的運行結果。
應用實例
現在,這裡有兩個csv文件(如下兩幅圖所示),一個存儲的是以"LinkID", "Link_start", "Link_end"為列標題的共1529行3列的數據,每個LinkID可以理解為一個點,另外一個csv文件存儲的是以"LinkID", "ReportTime", "Volume", "Speed"為列標題的共8878865行4列的數據。我們有一個任務:將這800多萬行的數據分割並為多個Excel文件,其中,按照每20個LinkID為一批數據的標準進行分割。
分析該任務,首先我們需要編寫Python程序讀取csv文件,這只需要導入Python標準庫中的cvs模塊即可;其次,由於每個LinkID都有上千行數據,因此20個LinkID就可能有上百萬上行數據,所以,Microsoft Office Excel2003的xls文件不能滿足要求,故使用xlsx格式來存儲我們分離出來的數據。
實現上述功能的Python程序代碼如下圖所示:
(1)第8行讀取csv文件,使用了列表推導式,最後將列表形式的數據轉換為numpy的ndarray類型以便後邊的處理,
(2)第55行處理數據時,使用了numpy的排序方法,代碼示例中時按照第一列的數據(即LinkID)來進行排序,所有的LinkID都是「HI + 數字 + 字母」的組合(其中字母時a,b,c,d,...)。要注意的是字符串也能進行排序,實際排序時,根據字符串的ASCII與數字的和的大小進行排序。
(3)第62行處理數據時,還是用到了numpy中刪除元素的方法,numpy類型的數組可以改變長度,這裡刪除元素使用的是np.delete方法,其中,刪除的條件使用了np.where進行設置;此外,還使用了np.insert方法向二維的numpy類型數組中插入了兩列值為空的數據,這是方便之後進行Excel中的單元格合併。
(4)第64和第65行處理數據時,使用了np.insert方法向二維的numpy類型數組中插入了兩列值為空的數據,這是方便之後進行Excel中的單元格合併。insert函數的value參數是指定要填充的內容,axis則是指定在哪一個維度上插入,這裡我們要插入列,也就是在第二個維度上插入,故axis為1。
最後執行的結果如下圖所示,首先,所有的數據已經成功地按每20個LinkID分割為了77個Excel文件,其次,從下面的第二幅圖可以看到,第二列和第三列的第一個LinkID所在的那幾行都已經合併了,而且第二列第一個LinkID所在單元格的值為「花園橋」,可見這是符合我們預期的。其中,Speed所在的列,的數據於csv中不同,全部做了保留了一位小數的處理,這是因為代碼中設定了工作簿的guess-type屬性為True。
歡迎您加入GIS遙感開發QQ群與同行交流