Python數據處理之導入導出excel數據

本文首發於公衆號“AntDream”,歡迎微信搜索“AntDream”或掃描文章底部二維碼關注,和我一起每天進步一點點

Python的一大應用就是數據分析了,而數據分析中,經常碰到需要處理Excel數據的情況。這裏做一個Python處理Excel數據的總結,基本受用大部分情況。相信以後用Python處理Excel數據不再是難事兒!

Python處理Excel數據需要用到2個庫:xlwtxlrdxlwt庫負責將數據導入生成Excel表格文件,而 xlrd庫則負責將Excel表格中的數據取出來。

xlwt庫將數據導入Excel

將數據寫入一個Excel文件

wb = xlwt.Workbook()
# 添加一個表
ws = wb.add_sheet('test')


# 3個參數分別爲行號,列號,和內容
# 需要注意的是行號和列號都是從0開始的
ws.write(0, 0, '第1列')
ws.write(0, 1, '第2列')
ws.write(0, 2, '第3列')

# 保存excel文件
wb.save('./test.xls')

可以看到,用xlwt庫操作非常簡單,基本就三步走:

  1. 打開一個Workbook對象,並用add_sheet方法添加一個表
  2. 然後就是用write方法寫入數據
  3. 最後用save方法保存

需要注意的是,xlwt庫裏面所定義的行和列都是從0開始計數的

定製Excel表格樣式

表格樣式一般主要有這麼幾塊內容:字體、對齊方式、邊框、背景色、寬度以及特殊內容,比如超鏈接、日期時間等。下面我們來分別看看用xlwt庫怎麼定製這些樣式。

字體

xlwt庫支持的字體屬性也比較多,大概如下:

設置字體需要用到xlwt庫的XFStyle類和Font類,代碼模版如下:

style = xlwt.XFStyle()

# 設置字體
font = xlwt.Font()
# 比如設置字體加粗和下劃線
font.bold = True
font.underline = True
style.font = font

# 然後應用
ws.write(2, 1, 'test', style)

後續幾個屬性的設置都是類似的,都是4步走:

  1. 拿到XFStyle
  2. 拿到對應需要的屬性,比如這裏的Font對象
  3. 設置具體的屬性值
  4. 最後就是在write方法寫入數據的時候應用就行
單元格對齊

先來看單元格對齊怎麼設置

# 單元格對齊
alignment = xlwt.Alignment()

# 水平對齊方式和垂直對齊方式
alignment.horz = xlwt.Alignment.HORZ_CENTER
alignment.vert = xlwt.Alignment.VERT_CENTER
# 自動換行
alignment.wrap = 1
style.alignment = alignment

# 然後應用
ws.write(2, 1, 'test', style)

上面這個自動換行的屬性還是蠻有用的,因爲我們很多時候數據會比較長,最好再加上單元格的寬度屬性一起使用,這樣整體樣式會好很多

單元格寬度設置:

# 設置單元格寬度,也就是某一列的寬度
ws.col(0).width = 6666
單元格的背景色

背景色對應的屬性是 Pattern

# 背景色
pattern = xlwt.Pattern()
pattern.pattern = xlwt.Pattern.SOLID_PATTERN

# 背景色爲黃色
# 0 = Black, 1 = White, 2 = Red, 3 = Green, 4 = Blue, 5 = Yellow, 6 = Magenta,
# 7 = Cyan, 16 = Maroon, 17 = Dark Green, 18 = Dark Blue, 19 = Dark Yellow ,
# almost brown), 20 = Dark Magenta, 21 = Teal, 22 = Light Gray, 23 = Dark Gray
# ...
pattern.pattern_fore_colour = 5
style.pattern = pattern

# 然後應用
ws.write(2, 1, 'test', style)
單元格邊框

邊框屬性是Borders

單元格邊框就2類:顏色和邊框線樣式

可以分別設置上下左右邊框的顏色和樣式

# 邊框
borders = xlwt.Borders()

# 邊框可以分別設置top、bottom、left、right
# 每個邊框又可以分別設置顏色和線樣式:實線、虛線、無
# 顏色設置,其他類似
borders.left_colour = 0x40
# 設置虛線,其他類似
borders.bottom = xlwt.Borders.DASHED
style.borders = borders

# 然後應用
ws.write(2, 1, 'test', style)
特殊內容,比如超鏈接和公式

特殊內容一般主要會碰到這幾類:超鏈接、公式和時間日期

處理這些特殊內容需要用到Formula

# 超鏈接
link = 'HYPERLINK("http://www.baidu.com";"Baidu")'
formula = xlwt.Formula(link)
ws.write(2, 0, formula)

# 公式也是類似
ws.write(1, 1, xlwt.Formula('SUM(A1,B1)'))

# 時間
style.num_format_str = 'M/D/YY'
ws.write(2, 1, datetime.datetime.now(), style)

以上就是用Python將數據寫入到Excel的全部內容了,下面我們再來看看怎麼讀取Excel中的數據做處理。


xlrd庫讀取Excel中的數據

讀取Excel文件

同樣的用xlrd庫讀取Excel的數據也是輕輕鬆鬆,先來看下實現代碼

# 先打開一個文件
wb = xlrd.open_workbook(file_path)
# 獲取第一個表
sheet1 = wb.sheet_by_index(0)

# 總行數
nrows = sheet1.nrows
# 總列數
ncols = sheet1.ncols

# 後面就通過循環即可遍歷數據了
# 取數據
for i in range(nrows):
    for j in range(ncols):
        # cell_value方法取出第i行j列的數據
        value = sheet1.cell_value(i, j)
        print(value)

總結一下,分爲一下幾步:

  1. 首先通過xlrd庫的open_workbook方法打開Excel文件
  2. 然後通過sheet_by_index方法獲取表
  3. 然後分別獲取表的行數和列數,便於後面循環遍歷
  4. 根據列數和行數,循環遍歷,通過cell_value方法獲取每個單元格中的數據

工作表的相關操作

獲取一個工作表,有多種方式

# 通過索引
sheet1 = wb.sheets()[0]
sheet1 = wb.sheet_by_index(0)

# 通過名字
sheet1 = wb.sheet_by_name('test')

# 獲取所有表名
# sheet_names = wb.sheet_names()

獲取某一行或某一列的所有數據

# 獲取行中所有數據,返回結果是一個列表
tabs = sheet1.row_values(rowx=0, start_colx=0, end_colx=None)
# 返回一行一共有多少數據
len_value = sheet1.row_len(rowx=0)

row_values的三個參數分別是:行號、開始的列和結束的列,其中結束的列爲None表示獲取從開始列到最後的所有數據

類似的還有獲取某一列的數據

cols = sheet1.col_values(colx=0, start_rowx=0, end_rowx=None)

處理時間數據

時間數據比較特殊,沒發直接通過上面的cell_value方法獲取。需要先轉換爲時間戳,然後再格式化成我們想要的格式。

比如要獲取Excel表格中,格式爲2019/8/13 20:46:35的時間數據

# 獲取時間
time_value = sheet1.cell_value(3, 0)

# 獲取時間戳
time_stamp = int(xlrd.xldate.xldate_as_datetime(time_value, 0).timestamp())
print(time_stamp)

# 格式化日期
time_rel = time.strftime("%Y/%m/%d", time.localtime(time_stamp))
print(time_rel)

基本也是三步走:

  1. 通過cell_value方法獲取時間值
  2. 然後通過xldate_as_datetime方法獲取時間戳
  3. 然後格式化一下

總結

Excel文件是用Python處理數據時常會碰到的一類場景,有了xlwtxlrd的幫助可以非常快速的導入和導出Excel數據。大家可以把這篇文章收藏起來,以後碰到處理Excel文件的時候可以參考一下。


                         歡迎關注我的公衆號查看更多精彩文章!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章