python讀寫excel文件

一、背景

python自動化測試中,有時候也需要使用到Excel文件,而此時要借用第三方庫才能進(jìn)行操作。在執(zhí)行讀execl文件時要用到xlrd庫,要寫入數(shù)據(jù)至excel文件時,要用到xlwt庫,它們需要單獨安裝,安裝方式也非常簡單。當(dāng)然也可以用其他的第三方庫,比如openpyxl和xlutils庫。最后,選擇什么模塊要根據(jù)實際情況而定。

二、各模塊之間的區(qū)別

xlrd,xlwt和xlutils是用Python處理Excel文檔(*.xls)的高效率工具。其中,xlrd只能讀取xls,xlwt只能新建xls(不可以修改),xlutils能將xlrd.Book轉(zhuǎn)為xlwt.Workbook,從而得以在現(xiàn)有xls的基礎(chǔ)上修改數(shù)據(jù),并創(chuàng)建一個新的xls,實現(xiàn)修改。openpyxl(可讀寫excel表)專門處理Excel2007及以上版本產(chǎn)生的xlsx文件,xls和xlsx之間轉(zhuǎn)換容易。另外,還有以下特點。

  • 讀取文件速度,xlrd比openpyxl較快
  • xlwt寫入文件效率較高
  • xlwt寫入數(shù)據(jù)會有局限性,不能寫入超過65535行、256列的數(shù)據(jù)(因為它只支持Excel 2003及之前的版本,在這些版本的Excel中行數(shù)和列數(shù)有此限制)
  • xlrd,xlwt和xlutils是用Python處理Excel文檔(*.xls)的高效率工具。其中,xlrd只能讀取xls,xlwt只能新建xls(不可以修改),xlutils能將xlrd.Book轉(zhuǎn)為xlwt.Workbook,從而得以在現(xiàn)有xls的基礎(chǔ)上修改數(shù)據(jù)
  • xlwt不支持07版以后的excel并創(chuàng)建一個新的xlsx(可以創(chuàng)建xls格式的excel文件),openpyxl支持07+的excel,一直有人在維護,文檔清晰易讀。

三、安裝第三方庫

這里選擇xlrd,xlwt模塊進(jìn)行簡單介紹。

安裝xlrd庫:

pip install xlrd

安裝xlwt庫:

pip install xlwt

也可以直接在pycharm編輯器中安裝,方法也非常的簡單:先打開settings,然后找到project interpreter,最后再添加想要安裝的模塊即可。

四、讀取excel文件數(shù)據(jù)

這里準(zhǔn)備了一個招聘人員信息表,名字叫zhaopin.xlsx的工作簿,其中有兩個表,名字叫招聘人員和數(shù)據(jù)分析。如圖:

下面我們用python第三方庫xlrd來讀取工作簿中的信息。

1、 sheet_names:獲取所有的sheet的名字。

import xlrd

workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet_names = workbook.sheet_names() # 獲得工作簿中的所有表明
print(sheet_names)

結(jié)果:

['招聘人員', '數(shù)據(jù)分析']

2、 sheet_by_index:根據(jù)索引獲取sheet對象。

import xlrd

workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet0 = workbook.sheet_by_index(0) # 獲取索引為0的表對象,0對應(yīng)的是excel工作簿中的第一張表
sheet1 = workbook.sheet_by_index(1) # 獲取索引為1的表對象,1對應(yīng)的是excel工作簿中的第二張表
print(sheet0.name)
print(sheet1.name)

結(jié)果:

招聘人員
數(shù)據(jù)分析

3、 sheet_by_name:根據(jù)名字獲取sheet對象。

import xlrd

workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_name('數(shù)據(jù)分析')
print(sheet.name)

結(jié)果:

數(shù)據(jù)分析

注意:sheet_by_name('數(shù)據(jù)分析')括號中的表名稱一定要填寫正確,否則無法找到對象,會報錯。

4、sheets:獲取所有的sheet對象。

import xlrd

workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheets = workbook.sheets() # 獲取所有的`sheet`對象
for sheet in sheets:
    print(sheet.name)

結(jié)果:

招聘人員
數(shù)據(jù)分析

5、sheet.nrows:這個sheet中的行數(shù)。

6、sheet.ncols:這個sheet中的列數(shù)。

import xlrd

workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_index(0) # 獲取索引為0的表對象,0對應(yīng)的是excel工作簿中的第一張表
sheet_nrows = sheet.nrows # 這個`sheet`中的行數(shù)
sheet_ncols = sheet.ncols # 這個`sheet`中的列數(shù)
print('行數(shù)為:{}'.format(sheet_nrows))
print('列數(shù)為:{}'.format(sheet_ncols))

結(jié)果:

行數(shù)為:78
列數(shù)為:7

7、sheet.cell(row,col):獲取指定行和列的cell對象。

import xlrd

workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_name('招聘人員')
cells = sheet.cell(0,1) # 獲取指定0行和1列的cell對象。
print(cells.value) # 打印這個cell里面的值。

結(jié)果:

姓名

8、sheet.row_slice(row,start_col,end_col):獲取指定行的某幾列的cell對象。

import xlrd

workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_name('招聘人員')
cells = sheet.row_slice(0,0,6) # 獲取指定0行的0列到5列的cell對象。
print(cells)

結(jié)果:

[text:'序號', text:'姓名', text:'性別', text:'專業(yè)', text:'學(xué)歷', text:'畢業(yè)院校']

9、sheet.col_slice(col,start_row,end_row):獲取指定列的某幾行的cell對象。

import xlrd

workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_index(0) # 獲取索引為0的表對象,0對應(yīng)的是excel工作簿中的第一張表
cells = sheet.col_slice(1,0,5)#獲取1列0行到4行的cell對象,返回一個列表
for cell in cells:
    print(cell.value) # 打印這個cell里面的值。

結(jié)果:

姓名
馮濤
李佳楠
羅旭
張自航

10、sheet.cell_value(row,col):獲取指定行和列的值。

import xlrd

workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_index(0)
cells = sheet.cell_value(0,5)
print(cells)

結(jié)果:

畢業(yè)院校

11、sheet.row_values(row,start_col,end_col):獲取指定行的某幾列的值。

import xlrd

workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_index(0)
cells = sheet.row_values(0,0,6) # 獲取0行從0列到5列的值。
print(cells)

結(jié)果:

['序號', '姓名', '性別', '專業(yè)', '學(xué)歷', '畢業(yè)院校']

注意:它與sheet.row_slice(row,start_col,end_col)的區(qū)別,一個是獲取對象,一個是獲取值。

12、sheet.col_values(col,start_row,end_row):獲取指定列的某幾行的值。

import xlrd

workbook = xlrd.open_workbook('zhaopin.xlsx') # 打開名字叫'zhaopin.xlsx'的工作簿
sheet = workbook.sheet_by_index(0)
cells = sheet.col_values(1,0,5)
print(cells)

結(jié)果:

['姓名', '馮濤', '李佳楠', '羅旭', '張自航']

注意:它與sheet.col_slice(col,start_row,end_row)的區(qū)別,一個是獲取對象,一個是獲取值。

五、寫入數(shù)據(jù)至excel文件

1、cell的數(shù)據(jù)類型

  • xlrd.XL_CELL_TEXT(Text):文本類型。
  • xlrd.XL_CELL_NUMBER(Number):數(shù)值類型。
  • xlrd.XL_CELL_DATE(Date):日期時間類型。
  • xlrd.XL_CELL_BOOLEAN(Bool):布爾類型。
  • xlrd.XL_CELL_BLANK:空白數(shù)據(jù)類型。

2、寫入數(shù)據(jù)至excel文件步驟

  • 首先,導(dǎo)入xlwt模塊。
  • 然后,創(chuàng)建一個Workbook對象。
  • 然后,創(chuàng)建一個Sheet對象。
  • 接著,使用sheet.write(row,col,data)方法把數(shù)據(jù)寫入到Sheet下指定行和列中。如果想要在原來workbook對象上添加新的cell,那么需要調(diào)用put_cell來添加。
  • 最后,保存成Excel文件。

3、實例

比如,我想在原來的‘zhaopin.xlsx’表中添加"總分"一列,并在其中隨機填充面試得分。需要注意,如果想要在原來已經(jīng)存在的Excel文件中添加新的行或者新的列,那么需要采put_cell(row,col,type,value,xf_index)來添加進(jìn)去,最后再放到xlwt創(chuàng)建的workbook中,然后再保存進(jìn)去。示例代碼如下:

import xlwt
import xlrd
import random

workbook = xlrd.open_workbook('zhaopin.xlsx')  # 打開名字叫'zhaopin.xlsx'的工作簿
rsheet = workbook.sheet_by_index(0)
rsheet.put_cell(0, 6, xlrd.XL_CELL_TEXT, '總分', None)  # 在0行6列處添加“總分”列,列屬性為文本

for row in range(1, rsheet.nrows):
    rsheet.put_cell(
        row,
        6,
        xlrd.XL_CELL_TEXT,
        random.randint(
            70,
            99),
        None)  # 隨機向每行6列添加70~99之間的數(shù)

write_workbook = xlwt.Workbook(encoding='utf8')  # 重新創(chuàng)建一個工作簿
wsheet = write_workbook.add_sheet('招聘人員')  # 工作簿中創(chuàng)建一個名字為“招聘人員”的表
for row in range(rsheet.nrows):
    for col in range(rsheet.ncols):
        wsheet.write(row, col, rsheet.cell_value(row, col))  # 將原表中的數(shù)據(jù)寫入新創(chuàng)建的表中

write_workbook.save('zhaopin_new.xls')  # 保存

結(jié)果:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容