xlrd預設將整型轉為浮點型

新夢想IT發表於2022-08-19


前言

學習這件事不在乎有沒有人教你,最重要的是在於你自己有沒有覺悟和恆心。 ——法布林 

快夜深人靜,窗外蛙聲一遍,把這篇寫完分享給大家!

一、問題來由

 

 

·  1.1 問題現象:筆者在編寫一段讀取excel資料的程式碼,excel中包含整型資料,如下圖

 

圖中 定位值 有很低機率是整型,超時時間 可填(整型)或 不可填(空字串)

·  1.2 簡單讀取程式碼:

import xlrd 

 

workbook = xlrd.open_workbook('page_element_infos.xlsx') 

sheet = workbook.sheet_by_index(0)

 

 

cell_value = sheet.cell_value(1,5)     #取第2行第6列的值

print(type(cell_value),cell_value)      #列印超時時間的值

 

上述程式碼是讀取圖片中的 excel,結果是 10.0,而我們需要的結果是10; 造成該問題的原因就是 xlrd模組 單元格為數字預設會轉換為浮點數; 說說我的實際編碼需求:如果為空就要給變數賦預設值 5 ,如果設定了值就用設定的整型值。

 

二、解決方法

 

 

·  2.1 可以直接把excel中的該列設定格式為文字格式,該列讀取的時候就為字串,然後再如下處理:

cell_value = sheet.cell_value(1,5) 

 

if cell_value == '' : #如果為空就要給變數賦預設值 5 

     cell_value = 5 

else: 

     cell_value = int(cell_value)

·  2.2 透過xlrd模組獲取單元格的資料型別,判斷型別後再進行處理:

cell = sheet.cell(1,5)                                      # 建立一個單元格物件 

#cell.ctype返回單元格值型別:0 empty,1 string,2 number,3 date,4 boolean,5 error 

if cell.ctype==2 and int(cell.value)==cell.value: #and後面為了防止該列為浮點數值時轉為整型 

     cell_value = int(cell.value) 

elif cell.ctype==0: #如果為空就要給變數賦預設值 5 

     cell_value = 5

·  2.3 透過 isinstance() 方法判斷資料型別來進行判斷處理:

cell_value = sheet.cell_value(1,5) 

cell_value = int(cell_value) if isinstance(cell_value,float) else 5 #isinstance判斷

cell_value值的型別是否為浮點型 

print(cell_value)

 

 

以上三個例項程式碼小結:

 

 

·  例項一從源頭出發解決,只有設定 excel格式就行,也好理解;

·  例項二考慮的最為全面,教科書式的標準方法,考慮了單元格如果真為浮點型的特殊情況;

·  例項三是我目前的場景需求原因,想了半天設計的一個方法,程式碼寫起來比較優雅,其實還可以最佳化成一行

cell_value = int(sheet.cell_value(1,5)) if isinstance(sheet.cell_value(1,5),float) else 5

·  透過這個小例子想讓大家知道實現功能的方法很多,你只需要能透過一種完成效果就行

·  筆者不急於給出大家一段實現程式碼的答案,而是囉嗦這麼多,也是希望大家要學會程式碼編寫的思考方式

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69940641/viewspace-2911215/,如需轉載,請註明出處,否則將追究法律責任。

相關文章