【原】記錄一下第一次使用Python簡單處理Excel

最近遇到過幾次需要分析客戶發來的業務數據的工作。

客戶是用Excel發來的,分析之前需要把Excel裏的數據導入到數據庫中,後續會再利用程序對數據做分析。

現在主要講一下如何把Excel數據導入到數據庫中。

在導入前,先看看這個Excel數據的格式,發現會有以下幾個現象:

1)第一行的標題,中英文都有,命名比較雜,甚至名稱前後還有空格。直接拿用肯定不行,需要在導數據的時候,做一下數據的清洗整理格式轉換等。

2)下面的數據行中,個別列中的數據,也存在冗餘的空白字符,還有些日期時間後面會多出不需要的數字,還有些列數據需要根據轉換規則轉換一下才能用。

反正就是客戶給的數據,不好直接拿就用,需要做數據清洗整理轉換。

 

以往用的過的方法是:

1)在excel中,通過公式,去做清理。但是發現如果excel文件多了,也不方便,要每個文件裏都要寫一次公式,不想寫,懶……

2)通過平時工作中主要使用的C#去寫小程序,去處理,第一次感覺還不錯,後來發現有點小題大作了。後面反正就是不想寫程序了,發現手上寫的各種小程序,越來越多,用的頻率很低,有些只用過一次。

3)使用現成的工具,直接把excel數據導入數據庫中,再在數據庫,用sql去做數據清洗。這個方法用過一次,感覺也不錯,和第二種寫小程序差不多。

 

這次,我想試試Python,10年前就接觸了,可是一直沒有正兒八經用過他。

最近老是看到廣告,說用Python處理excel多麼多麼的牛X。

 

這次心動了一下,硬着頭皮,開始寫代碼,百度了10幾個頁面,各種參考學習,最終寫出了下面的代碼。

可以根據傳入的excel文件名,去對excel文件裏的數據,進行簡單的解析,數據處理,把處理完的新數據另存爲一份新的excel文件。

用起來還不錯,還有許多改進的空間,比較我能想到的有,可以自動遍歷當前目錄下面的excel文件,不要每次都要傳excel文件名作爲參數。

以後有機會再說吧。年紀大了,容易累,容易忘記事,記錄一下,防止下次需要用到。

import sys
import os
import xlrd #讀excel
import xlwt #寫excel

print(sys.argv)
if(len(sys.argv) < 2):
    print('請提供原始excel文件名')
    exit(0)

arg = sys.argv[1]
filename, suffix = os.path.splitext(arg) #分離文件名和後綴
print(filename, suffix)
# exit(0)

#判斷變量類型的函數
def typeof(variate):
    type=None
    if isinstance(variate,int):
        type = "int"
    elif isinstance(variate,str):
        type = "str"
    elif isinstance(variate,float):
        type = "float"
    elif isinstance(variate,list):
        type = "list"
    elif isinstance(variate,tuple):
        type = "tuple"
    elif isinstance(variate,dict):
        type = "dict"
    elif isinstance(variate,set):
        type = "set"
    return type
# 返回變量類型

#打開文件
book = xlrd.open_workbook(filename + suffix)
book2 = xlwt.Workbook()

#獲取所有sheet的名字
# print('sheet頁名稱:', book.sheet_names())

sheet1 = book.sheet_by_index(0)
sheet2 = book2.add_sheet('Sheet1')

rows = sheet1.nrows
cols = sheet1.ncols
print('sheet1有%d行,%d列'%(rows, cols))
# print('第三行內容:', sheet1.row_values(2))
# print('第二列內容爲%s, 數據類型爲%s'%(sheet1.col_values(1), type(sheet1.col_values(1))))

# 複製第一行標題
for i in range(cols):
    val = sheet1.cell_value(0,i)
    val = val.strip()
    # print(val)
    sheet2.write(0, i, val)

# 嘗試解析第一行數據
for i in range(cols):
    for j in range(rows-1):
        val = sheet1.col(i)[j+1].value
        # print(val, type(val))
        print('.', end='')
        if typeof(val) == 'str':
            val = val.strip() # 移除字符串頭尾指定的字符(默認爲空格或換行符)或字符序列。
            
        # 處理處方號
        if(i == 3):
            val = val.replace('-','').replace('_','')
            val = int(val)
            val = str(val)

        # 處理時間後面的小尾巴
        if(i == 4  or i == 7 or i == 11 or i == 12 or i == 15):
            val = val.replace('.0','')

        sheet2.write(j+1, i, val)

# save new exlcel file
book2.save(filename + '_cleaned' + suffix)
print('excel file saved!')

# 新建excel並保存數據
# book2 = xlwt.Workbook()
# sheet2 = book2.add_sheet('Sheet1')
# sheet2.write(0, 0, 'hello')
# sheet2.write(1, 0, '你好')
# book2.save('hello.xls')
# print('excel file saved!')

  

補充:其實剛開始不想使用Python,因爲之前沒有用過,比較陌生。

後來在內心世界裏做了一會兒思想鬥爭——以往確實沒有用過什麼好的處理excel數據的方法啊,至少感覺還是挺費時間的,這次何不試一試Python。

慢慢的,發現,越用越感覺不錯。感覺可以提升效率,而且這個代碼,後續再遇到什麼新的需求,也可以改一改,就可以複用了。

或者後續,我再繼續邊做新需求,邊優化。(發現代碼優化這種想法,經常有,但是很少做,一般都是實在看不下去了,再去做)。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章