使用Python讀取和修改Excel文件(基于xlrd、xlwt和openpyxl模塊)
1、使用xlrd模塊對(duì)xls文件進(jìn)行讀操作
假設(shè)我們的表如下,是一個(gè)“農(nóng)村居民家庭人均純收入和農(nóng)村居民家庭人均消費(fèi)情況”的表格。后綴為.xls。里面包含兩個(gè)工作表,“各省市”和“測(cè)試表”。
提一下,一個(gè)Excel文件,就相當(dāng)于一個(gè)“工作簿”(workbook),一個(gè)“工作簿”里面可以包含多個(gè)“工作表(sheet)”
1.1?獲取工作簿對(duì)象
引入模塊,獲得工作簿對(duì)象。
import xlrd #引入模塊 #打開(kāi)文件,獲取excel文件的workbook(工作簿)對(duì)象 workbook=xlrd.open_workbook("DataSource/Economics.xls") #文件路徑
1.2?獲取工作表對(duì)象
我們知道一個(gè)工作簿里面可以含有多個(gè)工作表,當(dāng)我們獲取“工作簿對(duì)象”后,可以接著來(lái)獲取工作表對(duì)象,可以通過(guò)“索引”的方式獲得,也可以通過(guò)“表名”的方式獲得。
'''對(duì)workbook對(duì)象進(jìn)行操作''' #獲取所有sheet的名字 names=workbook.sheet_names() print(names) #['各省市', '測(cè)試表'] 輸出所有的表名,以列表的形式 #通過(guò)sheet索引獲得sheet對(duì)象 worksheet=workbook.sheet_by_index(0) print(worksheet) #<xlrd.sheet.Sheet object at 0x000001B98D99CFD0> #通過(guò)sheet名獲得sheet對(duì)象 worksheet=workbook.sheet_by_name("各省市") print(worksheet) #<xlrd.sheet.Sheet object at 0x000001B98D99CFD0> #由上可知,workbook.sheet_names() 返回一個(gè)list對(duì)象,可以對(duì)這個(gè)list對(duì)象進(jìn)行操作 sheet0_name=workbook.sheet_names()[0] #通過(guò)sheet索引獲取sheet名稱 print(sheet0_name) #各省市
1.3?獲取工作表的基本信息
在獲得“表對(duì)象”之后,我們可以獲取關(guān)于工作表的基本信息。包括表名、行數(shù)與列數(shù)。
'''對(duì)sheet對(duì)象進(jìn)行操作''' 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)打印出表的全部?jī)?nèi)容也變得輕而易舉。
for i in range(nrows): #循環(huán)打印每一行 print(worksheet.row_values(i)) #以列表形式讀出,列表中的每一項(xiàng)是str類型 #['各省市', '工資性收入', '家庭經(jīng)營(yíng)純收入', '財(cái)產(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?獲取某一個(gè)單元格的數(shù)據(jù)
?我們還可以將查詢精確地定位到某一個(gè)單元格。
在xlrd模塊中,工作表的行和列都是從0開(kāi)始計(jì)數(shù)的。
#通過(guò)坐標(biāo)讀取表格中的數(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模塊對(duì)xls文件進(jìn)行寫(xiě)操作
2.1?創(chuàng)建工作簿
# 導(dǎo)入xlwt模塊 import xlwt #創(chuàng)建一個(gè)Workbook對(duì)象,相當(dāng)于創(chuàng)建了一個(gè)Excel文件 book=xlwt.Workbook(encoding="utf-8",style_compression=0) ''' Workbook類初始化時(shí)有encoding和style_compression參數(shù) encoding:設(shè)置字符編碼,一般要這樣設(shè)置:w = Workbook(encoding='utf-8'),就可以在excel中輸出中文了。默認(rèn)是ascii。 style_compression:表示是否壓縮,不常用。 '''
2.2?創(chuàng)建工作表
創(chuàng)建完工作簿之后,可以在相應(yīng)的工作簿中,創(chuàng)建工作表。
# 創(chuàng)建一個(gè)sheet對(duì)象,一個(gè)sheet對(duì)象對(duì)應(yīng)Excel文件中的一張表格。 sheet = book.add_sheet('test01', cell_overwrite_ok=True) # 其中的test是這張表的名字,cell_overwrite_ok,表示是否可以覆蓋單元格,其實(shí)是Worksheet實(shí)例化的一個(gè)參數(shù),默認(rèn)值是False
2.3?按單元格的方式向工作表中添加數(shù)據(jù)
# 向表test中添加數(shù)據(jù) sheet.write(0, 0, '各省市') # 其中的'0-行, 0-列'指定表中的單元,'各省市'是向該單元寫(xiě)入的內(nèi)容 sheet.write(0, 1, '工資性收入') #也可以這樣添加數(shù)據(jù) txt1 = '北京市' sheet.write(1,0, txt1) txt2 = 5047.4 sheet.write(1, 1, txt2)
?最后被文件被保存之后,上文語(yǔ)句形成的“工作表”如下所示:
2.4?按行或列方式向工作表中添加數(shù)據(jù)
為了驗(yàn)證這個(gè)功能,我們?cè)诠ぷ鞑局?,再?chuàng)建一個(gè)工作表,上個(gè)工作表叫“test01”,那么這個(gè)工作表命名為“test02”,都隸屬于同一個(gè)工作簿。在下面代碼中test02是表名,sheet2才是可供操作的工作表對(duì)象。
#添加第二個(gè)表 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)營(yíng)純收入', '財(cái)產(chǎn)性收入', '轉(zhuǎn)移性收入', '食品', '衣著', '居住', '家庭設(shè)備及服務(wù)', '交通和通訊', '文教、娛樂(lè)用品及服務(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í)行出來(lái)的工作表test02如下所示:
3、使用openpyxl模塊對(duì)xlsx文件進(jìn)行讀操作
上面兩個(gè)模塊,xlrd和xlwt都是針對(duì)Excel97-2003操作的,也就是以xls結(jié)尾的文件。很顯然現(xiàn)在基本上都是Excel2007以上的版本,以xlsx為后綴。要對(duì)這種類型的Excel文件進(jìn)行操作要使用openpyxl,該模塊既可以進(jìn)行“讀”操作,也可以進(jìn)行“寫(xiě)”操作,還可以對(duì)已經(jīng)存在的文件做修改。
3.1?獲取工作簿對(duì)象
import openpyxl #獲取 工作簿對(duì)象 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) #['各省市', '測(cè)試表'] #在xlrd模塊中為 sheetnames=workbook.sheet_names() #使用上述語(yǔ)句會(huì)發(fā)出警告:DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames). #說(shuō)明 get_sheet_names已經(jīng)被棄用 可以改用 wb.sheetnames 方法 shenames=workbook.sheetnames print(shenames) #['各省市', '測(cè)試表']
3.3?獲取工作表對(duì)象
上一小節(jié)獲取的工作表名,可以被應(yīng)用在這一節(jié)中,用來(lái)獲取工作表對(duì)象。
#獲得工作簿的表名后,就可以獲得表對(duì)象 worksheet=workbook.get_sheet_by_name("各省市") print(worksheet) #<Worksheet "各省市"> #使用上述語(yǔ)句同樣彈出警告:DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]). #改寫(xiě)成如下格式 worksheet=workbook["各省市"] print(worksheet) #<Worksheet "各省市"> #還可以通過(guò)如下寫(xiě)法獲得表對(duì)象 worksheet1=workbook[shenames[1]] print(worksheet1) #<Worksheet "測(cè)試表">
3.4?根據(jù)索引方式獲取工作表對(duì)象
上一小節(jié)獲取工作表對(duì)象的方式,實(shí)際上是通過(guò)“表名”來(lái)獲取,我們可以通過(guò)更方便的方式,即通過(guò)“索引”方式獲取工作表對(duì)象。?
#還可以通過(guò)索引方式獲取表對(duì)象 worksheet=workbook.worksheets[0] print(worksheet) #<Worksheet "各省市"> #也可以用如下方式 #獲取當(dāng)前活躍的worksheet,默認(rèn)就是第一個(gè)worksheet ws = workbook.active
3.5?獲取工作表的屬性
得到工作表對(duì)象后,可以獲取工作表的相應(yīng)屬性,包括“表名”、“行數(shù)”、“列數(shù)”
#經(jīng)過(guò)上述操作,我們已經(jīng)獲得了第一個(gè)“表”的“表對(duì)象“,接下來(lái)可以對(duì)表對(duì)象進(jìn)行操作 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ù)
要想以行方式或者列方式,獲取整個(gè)工作表的內(nèi)容,我們需要使用到以下兩個(gè)生成器:
sheet.rows,這是一個(gè)生成器,里面是每一行數(shù)據(jù),每一行數(shù)據(jù)由一個(gè)元組類型包裹。
sheet.columns,同上,里面是每一列數(shù)據(jù)。
for row in worksheet.rows: for cell in row: print(cell.value,end=" ") print() """ 各省市 工資性收入 家庭經(jīng)營(yíng)純收入 財(cái)產(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)營(yíng)純收入 1957.1 2707.4 2039.6 1622.9 2406.2 2210.8 2556.7 2521.5 767.7 2271.4 …… …… '''
我們可以通過(guò)查看sheet.rows?里面的具體格式,來(lái)更好的理解代碼
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]來(lái)獲取第四行的tuple對(duì)象。
#輸出特定的行 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)營(yí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開(kāi)始計(jì)數(shù)。
3.8?獲取某一塊的數(shù)據(jù)
有時(shí)候我們并不需要一整行或一整列內(nèi)容,那么可以通過(guò)如下方式獲取其中一小塊的內(nèi)容。
注意兩種方式的區(qū)別,在第一種方式中,由于生成器被轉(zhuǎn)換成了列表的形式,所以索引是從0開(kāi)始計(jì)數(shù)的。
而第二種方式,行和列都是從1開(kāi)始計(jì)數(shù),這是和xlrd模塊中最大的不同,在xlrd中行和列都是從0計(jì)數(shù)的,openpyxl之所這么做是為了和Excel表統(tǒng)一,因?yàn)樵贓xcel表,就是從1開(kāi)始計(jì)數(shù)。
for rows in list(worksheet.rows)[0:3]: for cell in rows[0:3]: print(cell.value,end=" ") print() ''' 各省市 工資性收入 家庭經(jīng)營(yí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)營(yí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開(kāi)始計(jì)數(shù)的,而在xlrd中是由0開(kāi)始計(jì)數(shù)的
4、使用openpyxl模塊對(duì)xlsx文件進(jìn)行寫(xiě)操作
4.1?創(chuàng)建工作簿和獲取工作表
同樣的workbook=openpyxl.Workbook()?中“W”要大寫(xiě)。
import openpyxl # 創(chuàng)建一個(gè)Workbook對(duì)象,相當(dāng)于創(chuàng)建了一個(gè)Excel文件 workbook=openpyxl.Workbook() #wb=openpyxl.Workbook(encoding='UTF-8') #獲取當(dāng)前活躍的worksheet,默認(rèn)就是第一個(gè)worksheet worksheet = workbook.active worksheet.title="mysheet"
4.2?創(chuàng)建新的工作表
worksheet2 = workbook.create_sheet() #默認(rèn)插在工作簿末尾 #worksheet2 = workbook.create_sheet(0) #插入在工作簿的第一個(gè)位置 worksheet2.title = "New Title"
4.3?將數(shù)據(jù)寫(xiě)入工作表
#以下是我們要寫(xiě)入的數(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)營(yíng)純收入', '財(cái)產(chǎn)性收入', '轉(zhuǎn)移性收入', '食品', '衣著', '居住', '家庭設(shè)備及服務(wù)', '交通和通訊', '文教、娛樂(lè)用品及服務(wù)', '醫(yī)療保健', '其他商品及服務(wù)'] #寫(xiě)入第一行數(shù)據(jù),行號(hào)和列號(hào)都從1開(kāi)始計(jì)數(shù) for i in range(len(Project)): worksheet.cell(1, i+1,Project[i]) #寫(xiě)入第一列數(shù)據(jù),因?yàn)榈谝恍幸呀?jīng)有數(shù)據(jù)了,i+2 for i in range(len(Province)): worksheet.cell(i+2,1,Province[i]) #寫(xiě)入第二列數(shù)據(jù) for i in range(len(Income)): worksheet.cell(i+2,2,Income[i])
4.4?保存工作簿
workbook.save(filename='DataSource\\myfile.xlsx')
最后運(yùn)行結(jié)果如下所示:
5、修改已經(jīng)存在的工作簿(表)
5.1?插入一列數(shù)據(jù)
將第四節(jié)中最后保存的myfile.xlsx作為我們要修改的表格,我們計(jì)劃在最前面插入一列“編號(hào)”,如下所示:
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="編號(hào)" #每一行的一個(gè)row[0]就是第一列 else: row[0].value=index #枚舉出來(lái)是tuple類型,從0開(kāi)始計(jì)數(shù) workbook.save(filename="DataSource\myfile.xlsx")
運(yùn)行結(jié)果如下:
5.2?修改特定單元格
worksheet.cell(2,3,'0') worksheet["B2"]="Peking"
運(yùn)行結(jié)果如下:
5.3?批量修改數(shù)據(jù)
批量修改數(shù)據(jù)就相當(dāng)于寫(xiě)入,會(huì)自動(dòng)覆蓋。在上一節(jié)中已經(jīng)有介紹,不再贅述。
還有sheet.append()方法,可以用來(lái)添加行。
taiwan=[32,"臺(tái)灣省"] worksheet.append(taiwan)
運(yùn)行結(jié)果如下:
總結(jié)
到此這篇關(guān)于使用Python讀取和修改Excel文件(基于xlrd、xlwt和openpyxl模塊)的文章就介紹到這了,更多相關(guān)Python讀取和修改Excel文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python讀取excel文件中的數(shù)據(jù),繪制折線圖及散點(diǎn)圖
- 使用python的pandas讀取excel文件中的數(shù)據(jù)詳情
- Python讀取xlsx文件報(bào)錯(cuò):xlrd.biffh.XLRDError:?Excel?xlsx?file;not?supported問(wèn)題解決
- python讀取和保存為excel、csv、txt文件及對(duì)DataFrame文件的基本操作指南
- python讀取文件夾中圖片的圖片名并寫(xiě)入excel表格
- 淺談Python xlwings 讀取Excel文件的正確姿勢(shì)
- python3 循環(huán)讀取excel文件并寫(xiě)入json操作
- python讀取excel文件的方法
相關(guān)文章
Python調(diào)用Java可執(zhí)行jar包問(wèn)題
這篇文章主要介紹了Python調(diào)用Java可執(zhí)行jar包問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12python內(nèi)置函數(shù)compile(),complex()的使用
這篇文章主要為大家詳細(xì)介紹了python內(nèi)置函數(shù)compile(),complex()的使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Python實(shí)現(xiàn)視頻字幕時(shí)間軸格式轉(zhuǎn)換的示例
本文主要介紹了Python實(shí)現(xiàn)視頻字幕時(shí)間軸格式轉(zhuǎn)換的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11