使用Python讀取和修改Excel文件(基于xlrd、xlwt和openpyxl模塊)
1、使用xlrd模塊對xls文件進行讀操作
假設(shè)我們的表如下,是一個“農(nóng)村居民家庭人均純收入和農(nóng)村居民家庭人均消費情況”的表格。后綴為.xls。里面包含兩個工作表,“各省市”和“測試表”。
提一下,一個Excel文件,就相當(dāng)于一個“工作簿”(workbook),一個“工作簿”里面可以包含多個“工作表(sheet)”
1.1?獲取工作簿對象
引入模塊,獲得工作簿對象。
import xlrd #引入模塊 #打開文件,獲取excel文件的workbook(工作簿)對象 workbook=xlrd.open_workbook("DataSource/Economics.xls") #文件路徑
1.2?獲取工作表對象
我們知道一個工作簿里面可以含有多個工作表,當(dāng)我們獲取“工作簿對象”后,可以接著來獲取工作表對象,可以通過“索引”的方式獲得,也可以通過“表名”的方式獲得。
'''對workbook對象進行操作''' #獲取所有sheet的名字 names=workbook.sheet_names() print(names) #['各省市', '測試表'] 輸出所有的表名,以列表的形式 #通過sheet索引獲得sheet對象 worksheet=workbook.sheet_by_index(0) print(worksheet) #<xlrd.sheet.Sheet object at 0x000001B98D99CFD0> #通過sheet名獲得sheet對象 worksheet=workbook.sheet_by_name("各省市") print(worksheet) #<xlrd.sheet.Sheet object at 0x000001B98D99CFD0> #由上可知,workbook.sheet_names() 返回一個list對象,可以對這個list對象進行操作 sheet0_name=workbook.sheet_names()[0] #通過sheet索引獲取sheet名稱 print(sheet0_name) #各省市
1.3?獲取工作表的基本信息
在獲得“表對象”之后,我們可以獲取關(guān)于工作表的基本信息。包括表名、行數(shù)與列數(shù)。
'''對sheet對象進行操作''' name=worksheet.name #獲取表的姓名 print(name) #各省市 nrows=worksheet.nrows #獲取該表總行數(shù) print(nrows) #32 ncols=worksheet.ncols #獲取該表總列數(shù) print(ncols) #13
1.4?按行或列方式獲得工作表的數(shù)據(jù)
有了行數(shù)和列數(shù),循環(huán)打印出表的全部內(nèi)容也變得輕而易舉。
for i in range(nrows): #循環(huán)打印每一行 print(worksheet.row_values(i)) #以列表形式讀出,列表中的每一項是str類型 #['各省市', '工資性收入', '家庭經(jīng)營純收入', '財產(chǎn)性收入', ………………] #['北京市', '5047.4', '1957.1', '678.8', '592.2', '1879.0,…………] col_data=worksheet.col_values(0) #獲取第一列的內(nèi)容 print(col_data)
1.5?獲取某一個單元格的數(shù)據(jù)
?我們還可以將查詢精確地定位到某一個單元格。
在xlrd模塊中,工作表的行和列都是從0開始計數(shù)的。
#通過坐標讀取表格中的數(shù)據(jù) cell_value1=sheet0.cell_value(0,0) cell_value2=sheet0.cell_value(1,0) print(cell_value1) #各省市 print(cell_value2) #北京市 cell_value1=sheet0.cell(0,0).value print(cell_value1) #各省市 cell_value1=sheet0.row(0)[0].value print(cell_value1) #各省市
2、使用xlwt模塊對xls文件進行寫操作
2.1?創(chuàng)建工作簿
# 導(dǎo)入xlwt模塊 import xlwt #創(chuàng)建一個Workbook對象,相當(dāng)于創(chuàng)建了一個Excel文件 book=xlwt.Workbook(encoding="utf-8",style_compression=0) ''' Workbook類初始化時有encoding和style_compression參數(shù) encoding:設(shè)置字符編碼,一般要這樣設(shè)置:w = Workbook(encoding='utf-8'),就可以在excel中輸出中文了。默認是ascii。 style_compression:表示是否壓縮,不常用。 '''
2.2?創(chuàng)建工作表
創(chuàng)建完工作簿之后,可以在相應(yīng)的工作簿中,創(chuàng)建工作表。
# 創(chuàng)建一個sheet對象,一個sheet對象對應(yīng)Excel文件中的一張表格。 sheet = book.add_sheet('test01', cell_overwrite_ok=True) # 其中的test是這張表的名字,cell_overwrite_ok,表示是否可以覆蓋單元格,其實是Worksheet實例化的一個參數(shù),默認值是False
2.3?按單元格的方式向工作表中添加數(shù)據(jù)
# 向表test中添加數(shù)據(jù) sheet.write(0, 0, '各省市') # 其中的'0-行, 0-列'指定表中的單元,'各省市'是向該單元寫入的內(nèi)容 sheet.write(0, 1, '工資性收入') #也可以這樣添加數(shù)據(jù) txt1 = '北京市' sheet.write(1,0, txt1) txt2 = 5047.4 sheet.write(1, 1, txt2)
?最后被文件被保存之后,上文語句形成的“工作表”如下所示:
2.4?按行或列方式向工作表中添加數(shù)據(jù)
為了驗證這個功能,我們在工作簿中,再創(chuàng)建一個工作表,上個工作表叫“test01”,那么這個工作表命名為“test02”,都隸屬于同一個工作簿。在下面代碼中test02是表名,sheet2才是可供操作的工作表對象。
#添加第二個表 sheet2=book.add_sheet("test02",cell_overwrite_ok=True) Province=['北京市', '天津市', '河北省', '山西省', '內(nèi)蒙古自治區(qū)', '遼寧省', '吉林省', '黑龍江省', '上海市', '江蘇省', '浙江省', '安徽省', '福建省', '江西省', '山東省', '河南省', '湖北省', '湖南省', '廣東省', '廣西壯族自治區(qū)', '海南省', '重慶市', '四川省', '貴州省', '云南省', '西藏自治區(qū)', '陜西省', '甘肅省', '青海省', '寧夏回族自治區(qū)', '新疆維吾爾自治區(qū)'] Income=['5047.4', '3247.9', '1514.7', '1374.3', '590.7', '1499.5', '605.1', '654.9', '6686.0', '3104.8', '3575.1', '1184.1', '1855.5', '1441.3', '1671.5', '1022.7', '1199.2', '1449.6', '2906.2', '972.3', '555.7', '1309.9', '1219.5', '715.5', '441.8', '568.4', '848.3', '637.4', '653.3', '823.1', '254.1'] Project=['各省市', '工資性收入', '家庭經(jīng)營純收入', '財產(chǎn)性收入', '轉(zhuǎn)移性收入', '食品', '衣著', '居住', '家庭設(shè)備及服務(wù)', '交通和通訊', '文教、娛樂用品及服務(wù)', '醫(yī)療保健', '其他商品及服務(wù)'] #填入第一列 for i in range(0, len(Province)): sheet2.write(i+1, 0, Province[i]) #填入第二列 for i in range(0,len(Income)): sheet2.write(i+1,1,Income[i]) #填入第一行 for i in range(0,len(Project)): sheet2.write(0,i,Project[i])
2.5?保存創(chuàng)建的文件
最后保存在特定路徑即可。
# 最后,將以上操作保存到指定的Excel文件中 book.save('DataSource\\test1.xls')
執(zhí)行出來的工作表test02如下所示:
3、使用openpyxl模塊對xlsx文件進行讀操作
上面兩個模塊,xlrd和xlwt都是針對Excel97-2003操作的,也就是以xls結(jié)尾的文件。很顯然現(xiàn)在基本上都是Excel2007以上的版本,以xlsx為后綴。要對這種類型的Excel文件進行操作要使用openpyxl,該模塊既可以進行“讀”操作,也可以進行“寫”操作,還可以對已經(jīng)存在的文件做修改。
3.1?獲取工作簿對象
import openpyxl #獲取 工作簿對象 workbook=openpyxl.load_workbook("DataSource\Economics.xlsx") #與xlrd 模塊的區(qū)別 #wokrbook=xlrd.open_workbook(""DataSource\Economics.xls)
3.2?獲取所有工作表名
#獲取工作簿 workbook的所有工作表 shenames=workbook.get_sheet_names() print(shenames) #['各省市', '測試表'] #在xlrd模塊中為 sheetnames=workbook.sheet_names() #使用上述語句會發(fā)出警告:DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames). #說明 get_sheet_names已經(jīng)被棄用 可以改用 wb.sheetnames 方法 shenames=workbook.sheetnames print(shenames) #['各省市', '測試表']
3.3?獲取工作表對象
上一小節(jié)獲取的工作表名,可以被應(yīng)用在這一節(jié)中,用來獲取工作表對象。
#獲得工作簿的表名后,就可以獲得表對象 worksheet=workbook.get_sheet_by_name("各省市") print(worksheet) #<Worksheet "各省市"> #使用上述語句同樣彈出警告:DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]). #改寫成如下格式 worksheet=workbook["各省市"] print(worksheet) #<Worksheet "各省市"> #還可以通過如下寫法獲得表對象 worksheet1=workbook[shenames[1]] print(worksheet1) #<Worksheet "測試表">
3.4?根據(jù)索引方式獲取工作表對象
上一小節(jié)獲取工作表對象的方式,實際上是通過“表名”來獲取,我們可以通過更方便的方式,即通過“索引”方式獲取工作表對象。?
#還可以通過索引方式獲取表對象 worksheet=workbook.worksheets[0] print(worksheet) #<Worksheet "各省市"> #也可以用如下方式 #獲取當(dāng)前活躍的worksheet,默認就是第一個worksheet ws = workbook.active
3.5?獲取工作表的屬性
得到工作表對象后,可以獲取工作表的相應(yīng)屬性,包括“表名”、“行數(shù)”、“列數(shù)”
#經(jīng)過上述操作,我們已經(jīng)獲得了第一個“表”的“表對象“,接下來可以對表對象進行操作 name=worksheet.title #獲取表名 print(name) #各省市 #在xlrd中為worksheet.name #獲取該表相應(yīng)的行數(shù)和列數(shù) rows=worksheet.max_row columns=worksheet.max_column print(rows,columns) #32 13 #在xlrd中為 worksheet.nrows worksheet.ncols
3.6?按行或列方式獲取表中的數(shù)據(jù)
要想以行方式或者列方式,獲取整個工作表的內(nèi)容,我們需要使用到以下兩個生成器:
sheet.rows,這是一個生成器,里面是每一行數(shù)據(jù),每一行數(shù)據(jù)由一個元組類型包裹。
sheet.columns,同上,里面是每一列數(shù)據(jù)。
for row in worksheet.rows: for cell in row: print(cell.value,end=" ") print() """ 各省市 工資性收入 家庭經(jīng)營純收入 財產(chǎn)性收入 轉(zhuǎn)移性收入 食品 衣著 居住 家庭設(shè)備及服務(wù) …… 北京市 5047.4 1957.1 678.8 592.2 1879.0 451.6 859.4 303.5 698.1 844.1 575.8 113.1 …… 天津市 3247.9 2707.4 126.4 146.3 1212.6 265.3 664.4 122.4 441.3 315.6 263.2 56.1 …… …… """ for col in worksheet.columns: for cell in col: print(cell.value,end=" ") print() ''' 各省市 北京市 天津市 河北省 山西省 內(nèi)蒙古自治區(qū) 遼寧省 吉林省 黑龍江省 上海市 江蘇省 浙江省 …… 工資性收入 5047.4 3247.9 1514.7 1374.3 590.7 1499.5 605.1 654.9 6686.0 3104.8 3575.1 …… 家庭經(jīng)營純收入 1957.1 2707.4 2039.6 1622.9 2406.2 2210.8 2556.7 2521.5 767.7 2271.4 …… …… '''
我們可以通過查看sheet.rows?里面的具體格式,來更好的理解代碼
for row in worksheet.rows: print(row) ''' (<Cell '各省市'.A1>, <Cell '各省市'.B1>, <Cell '各省市'.C1>, <Cell '各省市'.D1>, <Cell '各省市'.E1>,…… (<Cell '各省市'.A2>, <Cell '各省市'.B2>, <Cell '各省市'.C2>, <Cell '各省市'.D2>, <Cell '各省市'.E2>, …… …… ''' #可知,需要二次迭代 for row in worksheet.rows: for cell in row: print(cell,end=" ") print() ''' <Cell '各省市'.A1> <Cell '各省市'.B1> <Cell '各省市'.C1> <Cell '各省市'.D1>…… <Cell '各省市'.A2> <Cell '各省市'.B2> <Cell '各省市'.C2> <Cell '各省市'.D2> …… …… ''' #還需要cell.value for row in worksheet.rows: for cell in row: print(cell.value,end=" ") print()
3.7?獲取特定行或特定列的數(shù)據(jù)
上述方法可以迭代輸出表的所有內(nèi)容,但是如果要獲取特定的行或列的內(nèi)容呢?我們可以想到的是用“索引”的方式,但是sheet.rows是生成器類型,不能使用索引。所以我們將其轉(zhuǎn)換為list之后再使用索引,例如用list(sheet.rows)[3]來獲取第四行的tuple對象。
#輸出特定的行 for cell in list(worksheet.rows)[3]: #獲取第四行的數(shù)據(jù) print(cell.value,end=" ") print() #河北省 1514.7 2039.6 107.7 139.8 915.5 167.9 531.7 115.8 285.7 265.4 166.3 47.0 #輸出特定的列 for cell in list(worksheet.columns)[2]: #獲取第三列的數(shù)據(jù) print(cell.value,end=" ") print() #家庭經(jīng)營純收入 1957.1 2707.4 2039.6 1622.9 2406.2 2210.8 2556.7 2521.5 767.7 2271.4 3084.3…… #已經(jīng)轉(zhuǎn)換成list類型,自然是從0開始計數(shù)。
3.8?獲取某一塊的數(shù)據(jù)
有時候我們并不需要一整行或一整列內(nèi)容,那么可以通過如下方式獲取其中一小塊的內(nèi)容。
注意兩種方式的區(qū)別,在第一種方式中,由于生成器被轉(zhuǎn)換成了列表的形式,所以索引是從0開始計數(shù)的。
而第二種方式,行和列都是從1開始計數(shù),這是和xlrd模塊中最大的不同,在xlrd中行和列都是從0計數(shù)的,openpyxl之所這么做是為了和Excel表統(tǒng)一,因為在Excel表,就是從1開始計數(shù)。
for rows in list(worksheet.rows)[0:3]: for cell in rows[0:3]: print(cell.value,end=" ") print() ''' 各省市 工資性收入 家庭經(jīng)營純收入 北京市 5047.4 1957.1 天津市 3247.9 2707.4 ''' for i in range(1, 4): for j in range(1, 4): print(worksheet.cell(row=i, column=j).value,end=" ") print() ''' 各省市 工資性收入 家庭經(jīng)營純收入 北京市 5047.4 1957.1 天津市 3247.9 2707.4 '''
3.9?獲取某一單元格的數(shù)據(jù)
有兩種方式。
#精確讀取表格中的某一單元格 content_A1= worksheet['A1'].value print(content_A1) content_A1=worksheet.cell(row=1,column=1).value #等同于 content_A1=worksheet.cell(1,1).value print(content_A1) #此處的行數(shù)和列數(shù)都是從1開始計數(shù)的,而在xlrd中是由0開始計數(shù)的
4、使用openpyxl模塊對xlsx文件進行寫操作
4.1?創(chuàng)建工作簿和獲取工作表
同樣的workbook=openpyxl.Workbook()?中“W”要大寫。
import openpyxl # 創(chuàng)建一個Workbook對象,相當(dāng)于創(chuàng)建了一個Excel文件 workbook=openpyxl.Workbook() #wb=openpyxl.Workbook(encoding='UTF-8') #獲取當(dāng)前活躍的worksheet,默認就是第一個worksheet worksheet = workbook.active worksheet.title="mysheet"
4.2?創(chuàng)建新的工作表
worksheet2 = workbook.create_sheet() #默認插在工作簿末尾 #worksheet2 = workbook.create_sheet(0) #插入在工作簿的第一個位置 worksheet2.title = "New Title"
4.3?將數(shù)據(jù)寫入工作表
#以下是我們要寫入的數(shù)據(jù) Province=['北京市', '天津市', '河北省', '山西省', '內(nèi)蒙古自治區(qū)', '遼寧省', '吉林省', '黑龍江省', '上海市', '江蘇省', '浙江省', '安徽省', '福建省', '江西省', '山東省', '河南省', '湖北省', '湖南省', '廣東省', '廣西壯族自治區(qū)', '海南省', '重慶市', '四川省', '貴州省', '云南省', '西藏自治區(qū)', '陜西省', '甘肅省', '青海省', '寧夏回族自治區(qū)', '新疆維吾爾自治區(qū)'] Income=['5047.4', '3247.9', '1514.7', '1374.3', '590.7', '1499.5', '605.1', '654.9', '6686.0', '3104.8', '3575.1', '1184.1', '1855.5', '1441.3', '1671.5', '1022.7', '1199.2', '1449.6', '2906.2', '972.3', '555.7', '1309.9', '1219.5', '715.5', '441.8', '568.4', '848.3', '637.4', '653.3', '823.1', '254.1'] Project=['各省市', '工資性收入', '家庭經(jīng)營純收入', '財產(chǎn)性收入', '轉(zhuǎn)移性收入', '食品', '衣著', '居住', '家庭設(shè)備及服務(wù)', '交通和通訊', '文教、娛樂用品及服務(wù)', '醫(yī)療保健', '其他商品及服務(wù)'] #寫入第一行數(shù)據(jù),行號和列號都從1開始計數(shù) for i in range(len(Project)): worksheet.cell(1, i+1,Project[i]) #寫入第一列數(shù)據(jù),因為第一行已經(jīng)有數(shù)據(jù)了,i+2 for i in range(len(Province)): worksheet.cell(i+2,1,Province[i]) #寫入第二列數(shù)據(jù) for i in range(len(Income)): worksheet.cell(i+2,2,Income[i])
4.4?保存工作簿
workbook.save(filename='DataSource\\myfile.xlsx')
最后運行結(jié)果如下所示:
5、修改已經(jīng)存在的工作簿(表)
5.1?插入一列數(shù)據(jù)
將第四節(jié)中最后保存的myfile.xlsx作為我們要修改的表格,我們計劃在最前面插入一列“編號”,如下所示:
import openpyxl workbook=openpyxl.load_workbook("DataSource\myfile.xlsx") worksheet=workbook.worksheets[0] #在第一列之前插入一列 worksheet.insert_cols(1) # for index,row in enumerate(worksheet.rows): if index==0: row[0].value="編號" #每一行的一個row[0]就是第一列 else: row[0].value=index #枚舉出來是tuple類型,從0開始計數(shù) workbook.save(filename="DataSource\myfile.xlsx")
運行結(jié)果如下:
5.2?修改特定單元格
worksheet.cell(2,3,'0') worksheet["B2"]="Peking"
運行結(jié)果如下:
5.3?批量修改數(shù)據(jù)
批量修改數(shù)據(jù)就相當(dāng)于寫入,會自動覆蓋。在上一節(jié)中已經(jīng)有介紹,不再贅述。
還有sheet.append()方法,可以用來添加行。
taiwan=[32,"臺灣省"] worksheet.append(taiwan)
運行結(jié)果如下:
總結(jié)
到此這篇關(guān)于使用Python讀取和修改Excel文件(基于xlrd、xlwt和openpyxl模塊)的文章就介紹到這了,更多相關(guān)Python讀取和修改Excel文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python讀取excel文件中的數(shù)據(jù),繪制折線圖及散點圖
- 使用python的pandas讀取excel文件中的數(shù)據(jù)詳情
- Python讀取xlsx文件報錯:xlrd.biffh.XLRDError:?Excel?xlsx?file;not?supported問題解決
- python讀取和保存為excel、csv、txt文件及對DataFrame文件的基本操作指南
- python讀取文件夾中圖片的圖片名并寫入excel表格
- 淺談Python xlwings 讀取Excel文件的正確姿勢
- python3 循環(huán)讀取excel文件并寫入json操作
- python讀取excel文件的方法
相關(guān)文章
Python調(diào)用Java可執(zhí)行jar包問題
這篇文章主要介紹了Python調(diào)用Java可執(zhí)行jar包問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12python內(nèi)置函數(shù)compile(),complex()的使用
這篇文章主要為大家詳細介紹了python內(nèi)置函數(shù)compile(),complex()的使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06Python實現(xiàn)視頻字幕時間軸格式轉(zhuǎn)換的示例
本文主要介紹了Python實現(xiàn)視頻字幕時間軸格式轉(zhuǎn)換的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11