Python使用xlrd輕松讀取Excel文件的示例代碼
xlrd
概述
xlrd是一個用于讀取Excel文件的Python庫,它可以幫助用戶快速提取數(shù)據(jù)并進行分析。它適合用于讀取舊版Excel 文件(.xls 格式)中的數(shù)據(jù),對于新格式的Excel文件,推薦使用其他庫如openpyxl或pandas。
文檔:https://xlrd.readthedocs.io/en/latest/
安裝
首先,需要確保已安裝xlrd
pip install xlrd==1.2.0
注意:xlrd新版本只支持xls格式,因此這里指定安裝1.2.0版本,可以支持xlsx格式。
讀取Excel文件
使用 xlrd 打開一個 Excel 文件
import xlrd
# 打開 Excel 文件
workbook = xlrd.open_workbook('Test.xlsx')
sheet操作
獲取sheet工作表
可以通過索引或名稱獲取工作表
# 1.通過索引查找
sheet = workbook.sheet_by_index(0)
# 2.通過sheet名查找:
sheet = workbook.sheet_by_name('Sheet1')
獲取sheet的行、列數(shù)
獲取工作表的行數(shù)、列數(shù)
# 獲取行數(shù)和列數(shù)
num_rows = sheet.nrows
num_cols = sheet.ncols
print(f"行數(shù): {num_rows}, 列數(shù): {num_cols}")
遍歷操作sheet
# 獲取sheet數(shù)量
print(workbook.nsheets)
# 遍歷Excel工作簿中的所有工作表
for i in range(0, workbook.nsheets):
# 根據(jù)索引獲取當前工作表
sheet = workbook.sheet_by_index(i)
# 打印當前工作表左上角單元格的值 1行1列的值
print(sheet.cell_value(0, 0))
# 獲取所有sheet名字
print(workbook.sheet_names())
# 遍歷工作簿中的所有工作表
for i in workbook.sheet_names():
# 根據(jù)工作表名稱獲取工作表對象
sheet = workbook.sheet_by_name(i)
# 打印該工作表第一行第一列的單元格值
print(sheet.cell_value(0, 0))
單元格操作
讀取單元格內(nèi)容
可以通過指定行和列的索引來讀取單元格的值
# 讀取特定單元格(例如:第一行第一列) print(sheet.cell_value(0, 0)) # 獲取第二行第三列的值 print(sheet.cell_value(1, 2)) # 獲取第二行第三列的單元格對象 print(sheet.cell(1, 2).value) print(sheet.row(1)[2].value)
讀取單元格類型
可以獲取單元格的類型
# 獲取第一行第一列單元格的類型
cell_type = sheet.cell_type(0, 0)
# 0: NUMERIC, 1: STRING, 2: BLANK, 3: BOOLEAN, 4: ERROR
print(f"單元格類型: {cell_type}")
遍歷所有單元格
遍歷整個工作表的所有單元格并打印內(nèi)容
# 遍歷Excel表格的每一行和每一列,以獲取每個單元格的值
for row in range(sheet.nrows): # sheet.nrows返回表格的總行數(shù)
for col in range(sheet.ncols): # sheet.ncols返回表格的總列數(shù)
# 獲取當前位置(row, col)的單元格值
cell_value = sheet.cell_value(row, col)
# 打印單元格的位置和值
print(f"({row}, {col}) 的值: {cell_value}")
讀取特定范圍的單元格
如果只想讀取特定范圍的單元格,可以使用以下方法
# 讀取第1行到第3行,第1列到第2列的單元格
for row in range(1, 4):
for col in range(1, 3):
cell_value = sheet.cell_value(row, col)
print(f"({row}, {col}) 的值: {cell_value}")
讀取不同數(shù)據(jù)類型的單元格
xlrd 支持多種數(shù)據(jù)類型,包括數(shù)字、字符串、布爾值和錯誤。以下是如何讀取不同類型單元格的示例:
# 讀取特定單元格并判斷類型
cell_value = sheet.cell_value(1, 1) # 讀取第二行第二列
cell_type = sheet.cell_type(1, 1)
if cell_type == 0: # NUMERIC
print(f"數(shù)字: {cell_value}")
elif cell_type == 1: # STRING
print(f"字符串: {cell_value}")
elif cell_type == 2: # BLANK
print("空單元格")
elif cell_type == 3: # BOOLEAN
print(f"布爾值: {cell_value}")
elif cell_type == 4: # ERROR
print("錯誤單元格")
行、列操作
獲取整行或整列數(shù)據(jù)
可以獲取整行或整列的數(shù)據(jù)
# 獲取整行
row_values = sheet.row_values(0) # 第一行
print(f"第一行的值: {row_values}")
# 獲取整列
col_values = sheet.col_values(0) # 第一列
print(f"第一列的值: {col_values}")
讀取所有行的字典格式
使用以下方法以字典的形式讀取每一行
# 假設(shè)第一行為表頭
header = sheet.row_values(0)
# 初始化一個列表來存儲所有行的數(shù)據(jù)
data = []
# 使用循環(huán)遍歷除表頭外的所有行
for row in range(1, sheet.nrows):
# 初始化一個字典來存儲當前行的數(shù)據(jù)
row_data = {}
# 使用循環(huán)遍歷所有列
for col in range(sheet.ncols):
# 將單元格的值添加到當前行的字典中,使用表頭作為鍵
row_data[header[col]] = sheet.cell_value(row, col)
# 將當前行的字典添加到數(shù)據(jù)列表中
data.append(row_data)
# 打印最終的數(shù)據(jù)列表
print(data)
讀取特定列的非空值
# 初始化列索引值為0,表示第一列
col_index = 0
# 創(chuàng)建一個空列表,用于存儲第一列中的非空值
non_empty_values = []
# 遍歷Excel表格的每一行,以獲取第一列的值
for row in range(sheet.nrows):
# 獲取指定行列的單元格值
value = sheet.cell_value(row, col_index)
# 如果值不為空字符串,則將其添加到列表中
if value != '':
non_empty_values.append(value)
# 打印第一列中的非空值
print(f"第一列的非空值: {non_empty_values}")
其他操作
處理日期類型
如果單元格包含日期,xlrd會將其存儲為浮點數(shù)。可以使用xlrd.xldate.xldate_as_tuple() 方法將其轉(zhuǎn)換為日期元組:
import xlrd.xldate
# 假設(shè)第三行第一列是日期
date_value = sheet.cell_value(2, 0)
date_tuple = xlrd.xldate.xldate_as_tuple(date_value, workbook.datemode)
print(f"日期: {date_tuple}") # 輸出格式為 (年, 月, 日, 時, 分, 秒)
處理多種日期格式
有時Excel 中的日期格式可能會不同??梢詣?chuàng)建一個函數(shù)來處理多種日期格式
def parse_date(value):
"""
解析日期值。
根據(jù)值的類型將表示日期的浮點數(shù)轉(zhuǎn)換為可讀的日期元組。
參數(shù):
value (float): 一個表示日期的浮點數(shù),通常從電子表格軟件中讀取。
返回:
tuple 或 None: 如果輸入值是浮點數(shù),則返回一個包含年、月、日、時、分、秒的元組;
否則返回 None。
"""
if isinstance(value, float): # 日期通常是浮點數(shù)
return xlrd.xldate.xldate_as_tuple(value, workbook.datemode)
return None
# 遍歷表格的每一行
for row in range(sheet.nrows):
# 假設(shè)第一列是日期,獲取該行的日期值
date_value = sheet.cell_value(row, 0)
# 嘗試解析日期值
parsed_date = parse_date(date_value)
# 如果解析成功,則打印該行的日期信息
if parsed_date:
print(f"行 {row} 的日期: {parsed_date}")
處理空單元格
可以檢查單元格是否為空并進行相應(yīng)處理
for row in range(sheet.nrows):
for col in range(sheet.ncols):
cell_value = sheet.cell_value(row, col)
if cell_value == '':
print(f"({row}, {col}) 是空單元格")
else:
print(f"({row}, {col}) 的值: {cell_value}")
處理錯誤單元格
可以檢查單元格是否是錯誤類型
# 遍歷Excel表格的每個單元格,查找錯誤類型的單元格
for row in range(sheet.nrows):
for col in range(sheet.ncols):
# 判斷當前單元格的類型是否為錯誤類型
if sheet.cell_type(row, col) == 4: # 錯誤類型
print(f"({row}, {col}) 是錯誤單元格")
讀取大文件時的性能優(yōu)化
當處理非常大的 Excel 文件時,可以考慮只讀取必要的工作表或行,以減少內(nèi)存使用。可以使用 xlrd 的 open_workbook 方法中的 on_demand 參數(shù):
# 只在需要時加載工作表
workbook = xlrd.open_workbook('Test.xlsx', on_demand=True)
# 訪問工作表時才加載
sheet = workbook.sheet_by_index(0)
使用xlrd和pandas結(jié)合
如果需要更強大的數(shù)據(jù)處理能力,可以將xlrd與pandas結(jié)合使用。首先用xlrd讀取數(shù)據(jù),然后轉(zhuǎn)換為DataFrame
import pandas as pd
import xlrd
# 打開文件
workbook = xlrd.open_workbook('Test.xlsx')
# 通過索引獲取第一個工作表
sheet = workbook.sheet_by_index(0)
# 將數(shù)據(jù)轉(zhuǎn)換為 DataFrame
# 遍歷工作表中的每一行,將數(shù)據(jù)轉(zhuǎn)換為列表
data = []
for row in range(sheet.nrows):
data.append(sheet.row_values(row))
# 創(chuàng)建 DataFrame,將第一行作為列名,其余行作為數(shù)據(jù)
# data[1:]作為數(shù)據(jù),data[0]作為列名:第一行為表頭
df = pd.DataFrame(data[1:], columns=data[0])
# 打印 DataFrame
print(df)
自定義數(shù)據(jù)處理
可以在讀取單元格時自定義處理邏輯,例如將數(shù)字格式化為貨幣
def format_currency(value):
"""
將給定的數(shù)值格式化為貨幣格式。
參數(shù):
value (int, float): 需要格式化的數(shù)值。
返回:
str: 格式化后的字符串,如果輸入不是整數(shù)或浮點數(shù),則返回原值。
"""
# 格式化為貨幣形式,前面加上美元符號,并且保留兩位小數(shù)
return f"${value:,.2f}" if isinstance(value, (int, float)) else value
# 遍歷表格的每一行和每一列
for row in range(sheet.nrows):
for col in range(sheet.ncols):
# 獲取當前單元格的值
cell_value = sheet.cell_value(row, col)
# 將單元格的值格式化為貨幣形式
formatted_value = format_currency(cell_value)
# 打印格式化后的值
print(f"({row}, {col}) 的格式化值: {formatted_value}")
使用正則表達式提取特定數(shù)據(jù)
如果需要從單元格中提取特定格式的數(shù)據(jù),可以使用正則表達式
import re
# 定義一個正則表達式模式,用于匹配包含關(guān)鍵詞“Java”的字符串
pattern = r'Java'
# 假設(shè)在一個Excel工作表(sheet)中,遍歷所有行來查找符合特定模式的字符串
for row in range(sheet.nrows):
# 獲取當前行第二列的單元格值
cell_value = sheet.cell_value(row, 1)
# 在單元格值中搜索符合預(yù)定義模式的字符串
matches = re.findall(pattern, cell_value)
# 如果找到匹配項,則輸出行號和匹配項
if matches:
print(f"行 {row} 中找到的匹配項: {matches}")
處理條件格式
雖然xlrd不支持讀取條件格式,但可以根據(jù)業(yè)務(wù)規(guī)則手動處理
# 遍歷Excel工作表(sheet)的所有行,檢查第四列的值是否超過2800
for row in range(sheet.nrows):
# 獲取當前行第四列的單元格值
cell_value = sheet.cell_value(row, 3)
# 檢查單元格值是否為數(shù)字
if isinstance(cell_value, (int, float)):
# 根據(jù)條件進行處理
if cell_value > 2800:
print(f"行 {row} 的值超出限制: {cell_value}")
自定義類封裝讀取邏輯
可以將讀取邏輯封裝在一個類中,以便于重用和擴展
import xlrd
class ExcelReader:
"""
用于讀取Excel文件的類。
Attributes:
workbook : xlrd.Book
打開的Excel工作簿。
"""
def __init__(self, file_path):
"""
初始化ExcelReader實例。
參數(shù): file_path : str Excel文件的路徑。
"""
self.workbook = xlrd.open_workbook(file_path)
def get_sheet(self, index):
"""
根據(jù)索引獲取工作表。
參數(shù): index : int 工作表的索引。
返回: sheet : xlrd.Sheet 指定索引的工作表。
"""
return self.workbook.sheet_by_index(index)
def get_row_values(self, sheet, row_index):
"""
獲取一行的所有值。
參數(shù):
sheet : xlrd.Sheet 工作表。
row_index : int 行索引。
返回:
row_values : list 指定行的所有值。
"""
return sheet.row_values(row_index)
# 使用自定義類讀取Excel文件
reader = ExcelReader('Test.xlsx')
# 獲取第一個工作表
sheet = reader.get_sheet(0)
# 獲取第一行的所有值
row_values = reader.get_row_values(sheet, 1)
print(row_values)
以上就是Python使用xlrd輕松讀取Excel文件的示例代碼的詳細內(nèi)容,更多關(guān)于Python xlrd讀取Excel的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python多線程爬蟲實戰(zhàn)_爬取糗事百科段子的實例
下面小編就為大家分享一篇Python多線程爬蟲實戰(zhàn)_爬取糗事百科段子的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12
Pandas的Series結(jié)構(gòu)及常用操作實例
這篇文章主要介紹了Pandas的Series結(jié)構(gòu)及常用操作實例,Series序列,是一種一維的結(jié)構(gòu),類似于一維列表和ndarray中的一維數(shù)組,但是功能比他們要更為強大,Series由兩部分組成:索引index和數(shù)值values,需要的朋友可以參考下2023-07-07
在Python中通過機器學(xué)習(xí)實現(xiàn)人體姿勢估計
姿態(tài)檢測是計算機視覺領(lǐng)域的一個活躍研究領(lǐng)域。這篇文章將為大家介紹在Python中如何利用機器學(xué)習(xí)進行人體姿勢估計,感興趣的小伙伴可以了解一下2021-12-12
Python關(guān)于時間序列calendar模塊的深入講解
calendar,是與日歷相關(guān)的模塊。calendar模塊文件里定義了很多類型,主要有Calendar,TextCalendar以及HTMLCalendar類型。其中,Calendar是TextCalendar與HTMLCalendar的基類2021-11-11

