python 數據分析基礎二:excel文件處理(一) 開端

之前博主已經講完了對csv文件的操作,而且講的也算比較細吧。那麼需要學習數據處理這塊內容的小夥伴可以繼續關注博主。博主會繼續從excel文件處理開始

對excel文件的處理

excel在商業活動運用十分廣泛,人們使用excel的方式五花八門。
與python的csv模塊不同,python中並沒有處理excel文件的標準模塊,因此我們學習本章內容需要安裝兩個拓展包xlrdxlwt如果小夥伴安裝了Anaconda python 那麼便可以直接使用,這裏博主推薦大家如果覺得pycharm或者vs使用起來比較麻煩的話可以使用jupyter lab,這是博主常用一個python 筆記本。下載的話:

  1. 打開cmd
  2. 輸入指令 pip install jupyterlab
  3. 進度條加載完畢也就下載完了,你可以在cmd中進入任何目錄打開,不過博主建議你新建一個專用的文件夾。
    那麼爲了學習的開始,我們需要三個excel文件,這個我們可以去一個地址下載:傳送門
    當然由於是外網github社區所以會比較慢,但是文件本身並沒有特別大,所以小夥伴只需要等待片刻即可

    文件
    在這裏插入圖片描述

處理單個工作表

我們首先用一段代碼來引入學習:

from xlrd import open_workbook
input_file="sales_2013.xlsx"
workbook=open_workbook(input_file)#open_workbook()函數,xlrd模塊對excel文件的應用
print("Number of worksheets:",workbook.nsheets)#nsheets()函數,sheet本身具有片的意思,這裏應該可以理解爲頁
for row in workbook.sheets():
    print("Worksheet name:",row.name,"\trows:",row.nrows,"\tcolumns:",row.ncols)#每片的名,行,列

小夥伴們可以看到有很多陌生的字眼。沒關係,慢慢來,剛開始接觸這個模塊開始的小夥伴都很迷茫。

  1. 首先,我們需要導入一些模塊和函數,這裏我們使用from xlrd import open_workbook可以使我們後面的代碼稍微方便一點。(因爲不在需要每次引用的時候都在前面加一個xlrd.😢)
  2. 我們還要使用workbook來承接創建的工作對象。
  3. 這裏我們使用的是open_workbook函數打開文件,這是xlrd模塊中帶有的函數嗎,專用於打開excel工作簿的,打開方式與open類似,同樣的,我們也可以使用with open_workbook() as的形式,後面會用到
  4. workbook.nsheets,nsheets返回所有的工作表的數目,一個工作簿可以有多個工作表
  5. 我們使用for循環來遍歷每一個工作表,注意函數**workbook.sheets()**返回所有的工作表。
  6. name,nrows,ncols都是模塊裏的函數,他們的意思,也與字面意思相同分別是,工作表的名,行數,列數

利用基礎python讀寫excel文件

代碼:

#利用基礎python讀寫工作表
from xlrd import open_workbook
from xlwt import Workbook
input_file="sales_2013.xlsx"
out_file="output.xlsx"
out_object=Workbook()#實例化了一個workbook對象,後面會用到
out_work_sheet=out_object.add_sheet("jan_2013_output")#add_sheet爲工作簿添加一個工作表
with open_workbook(input_file) as workbook:#獲取所有的sheet
    worksheet=workbook.sheet_by_name('january_2013')#根據名引入一個sheet_by_name的工作表
    #print(worksheet.nrows)行數
    for row in range(worksheet.nrows):
        for column in range(worksheet.ncols):
            out_work_sheet.write(row,column,worksheet.cell_value(row,column))#分別爲:行索引。列索引,和所獲取的單元格的內容
out_object.save(out_file)#保存文件
#利用基礎python讀寫工作表,xlrd模塊和xlwt模塊
#在out_file上顯示的日期數,並沒有經過格式化,而是從1990年1月0日至表格日期的天數
#我們如果使用from和import的形式,便不再需要將模塊名加在前面

很多內容博主在學習的時候也已經標註清楚,小夥伴可以在代碼中自己看自己理解,當然博主也會在 解析

  1. 前文已經說到導入xlrd模塊,這裏我們還需要導入xlwt模塊纔可以實現對excel文件的寫的操作,相信小夥伴們在字面也看得出來xlrd其實就是read,xlwt其實就是write,這裏我們從xlwt導入Workbook。
  2. 需要讀取的文件是博主開頭展示的第一個文件,需要寫入的文件自己創建一個便可。
  3. 這裏的寫入,我們要注意,我們需要使用剛剛導入Workbook模塊去實例化一個可操作的對象,我們接下來需要對這個可操作對象操作
  4. out_work_sheet=out_object.add_sheet(“jan_2013_output”) 這裏,我們使用可操作對象,添加一個工作表,使用函數**.add_sheet**,注意前綴使我們實例化的對象,不是需要寫入的文件。
  5. 接着我們使用with open語句打開文件,獲取所有的工作表,繼而使用workbook.sheet_by_name(‘january_2013’) 根據工作表名獲取該工作表。
  6. 兩個for循環用來遍歷單元格的位置座標x和y,後面會用到
  7. out_work_sheet.write(row,column,worksheet.cell_value(row,column))
    這裏的 out_work_sheet 是我們之前創建的工作表的承接對象,write函數
    的第一個參量爲行索引,第二個參量爲列索引,也就是我們理解的x和y座標,這兩個擦亮爲我們提供需要操作的單元格的位置,後面的worksheet.cell_value,其實便是我們之前引用的原工作表的一個單元格的內容
  8. 最後我們使用out_object.save(out_file)保存文件

那麼這時候我們打開兩個工作簿進行對比會發現一個很明顯的問題

原工作簿:
在這裏插入圖片描述
我們寫入的工作簿
在這裏插入圖片描述
沒錯,時間出現了問題我們需要注意,這裏的時間是從1990年開始計數,到工作表中的時間。而且換算嫦娥了浮點數,並非是格式化的,該浮點數的格式是:(從1990年1月0日到該日期的日期數,加上二十四小時的浮點數)
那麼我們就需要格式化日期,這一步是有些麻煩,不過爲了精確處理數據,我們還是必須走這一步的😄
代碼:

#格式化日期數據,基於上一個代碼
from datetime import date
from xlrd import open_workbook,xldate_as_tuple
from xlwt import Workbook
input_file="sales_2013.xlsx"
output_file="output.xlsx"
out_object=Workbook()#實例化一個工作表對象
out_work_sheet=out_object.add_sheet("jan_2013_output")#添加一個工作表
with open_workbook(input_file) as workbook:
    worksheet=workbook.sheet_by_name("january_2013")#根據名選擇一個工作表
    for row_index in range(worksheet.nrows):
        row_list_output=[]
        for col_index in range(worksheet.ncols):
            if worksheet.cell_type(row_index,col_index)==3:#3爲cell_type所指的時間
                date_cell=xldate_as_tuple(worksheet.cell_value(row_index,col_index),workbook.datemode)#xldate_as_tuple將excel中代表時間的數值轉化爲元組
                #print(date_cell)經過驗證,該語句將時間格式化後的各組數字分別存入一個元組,格式如↓
                #(2013, 1, 1, 0, 0, 0)
                #(2013, 1, 6, 0, 0, 0)
                #(2013, 1, 11, 0, 0, 0)
                #(2013, 1, 18, 0, 0, 0)
                #(2013, 1, 24, 0, 0, 0) 給元組,列表前加 *可以將其拆分爲一個個獨立的元素,成爲三個可以引用的獨立對象,且不可迭代
                date_cell=date(*date_cell[0:3]).strftime("%m/%d/%Y")#賦值給date_cell,參數datemode的存在是確定時間是從1990年開始,並據此將數值轉化爲正確的元組
                row_list_output.append(date_cell)#strftime函數格式化爲時間
                out_work_sheet.write(row_index,col_index,date_cell)
            else:
                non_date_cell=worksheet.cell_value(row_index,col_index)#引用工作表的單元格
                row_list_output.append(non_date_cell)
                out_work_sheet.write(row_index,col_index,non_date_cell)
out_object.save(output_file)#保存

這段代碼,博主爲了講解清楚研究了有些時間,將其中的一些小的知識點啊,一些函數的運用啊,都做了標記

  1. cell_type()在xlrd模塊中,對很多信息進行了分類,而我們利用cell_type便能得到這個“模式”,而3便表示這個單元格中的是時間信息,因此,我們將其單獨格式
    拓展

當我們對一個列表或者元組加上 * 的時候,會將元素變爲單獨的引用對象,如↓
在這裏插入圖片描述

over 現在是凌晨1.06 博主今天就肝到這裏了

😄

需要繼續學習python處理excel的小夥伴可以關注博主哦!

武漢加油

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