最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python?xlrd實現(xiàn)從讀取Excel到高效數(shù)據(jù)提取的全面指南

 更新時間:2025年10月10日 08:41:42   作者:蕭鼎  
xlrd?是一個專門用于讀取?Excel?文件內(nèi)容的?Python?庫,它支持從?Excel?工作簿中提取工作表(Sheet),單元格內(nèi)容,數(shù)據(jù)類型等信息,下面小編就為大家詳細介紹一下它的具體使用吧

一、前言:Excel 與 Python 的不解之緣

在數(shù)據(jù)處理與辦公自動化領(lǐng)域,Excel 文件(.xls / .xlsx) 一直是最常見的數(shù)據(jù)載體。

而在 Python 世界中,圍繞 Excel 操作的生態(tài)非常龐大,其中最經(jīng)典、最輕量級的讀文件庫之一便是 —— xlrd。

xlrd 是一個專門用于讀取 Excel 文件內(nèi)容的 Python 庫,它支持從 Excel 工作簿中提取工作表(Sheet)、單元格內(nèi)容、數(shù)據(jù)類型等信息。

雖然在新版本中它僅支持舊格式 .xls 文件,但憑借其簡潔、高效和穩(wěn)定的特點,xlrd 依然在許多老系統(tǒng)與數(shù)據(jù)遷移任務(wù)中被廣泛使用。

二、庫的起源與演變:從萬能到專一

在早期的 Python Excel 生態(tài)中,xlrdxlwt(寫入)是一對黃金搭檔,配合使用可以輕松實現(xiàn) Excel 的讀寫操作。

  • xlrd(read):讀取 Excel 文件內(nèi)容。
  • xlwt(write):寫入 .xls 文件。
  • xlutils:基于二者實現(xiàn)的高級操作庫(復(fù)制、修改工作表等)。

然而,自 xlrd 2.0.0 起,官方宣布:

不再支持 .xlsx 文件讀取,僅支持 Excel 97-2003 格式 .xls。

主要原因包括:

  • Excel 2007 之后的 .xlsx 文件是基于 XML + ZIP 的復(fù)雜結(jié)構(gòu),解析成本高;
  • 已有更現(xiàn)代的庫如 openpyxlpandas 提供更好的支持;
  • 維護者希望 xlrd 聚焦舊格式的穩(wěn)定讀取。

這也導(dǎo)致了后期許多項目遷移至 openpyxlpandas.read_excel()。不過,如果你面對的是歷史系統(tǒng)、銀行報表、政府舊數(shù)據(jù),xlrd 仍然是最輕量可靠的解決方案。

三、安裝與環(huán)境要求

1. 安裝方式

pip install xlrd

2. 版本建議

如果你的 Excel 文件是 .xlsx 格式,請務(wù)必使用舊版本(≤1.2.0):

pip install xlrd==1.2.0

否則會遇到如下錯誤:

XLRDError: Excel xlsx file; not supported

3. 基本依賴

xlrd 只依賴標(biāo)準(zhǔn)庫和 zipfile 模塊,因此即使在嵌入式系統(tǒng)(如樹莓派、Jetson Nano)上也能輕松運行。

四、核心對象結(jié)構(gòu)分析

xlrd 的內(nèi)部設(shè)計采用了典型的分層數(shù)據(jù)結(jié)構(gòu),理解這點有助于掌握其靈活性:

層級對象名稱描述
1BookExcel 文件對象(工作簿)
2Sheet每個工作表
3Cell單元格對象(包含值與類型)
4XFRecord樣式記錄對象(字體、邊框、格式等)

這種結(jié)構(gòu)類似于文檔樹(Document Object Model),讀取 Excel 時,xlrd 會逐級解析:

import xlrd

workbook = xlrd.open_workbook("data.xls")
sheet = workbook.sheet_by_index(0)
value = sheet.cell_value(0, 0)
print(value)

執(zhí)行結(jié)果:

員工編號

五、主要API與使用方法詳解

1. 打開 Excel 文件

import xlrd
book = xlrd.open_workbook("report.xls")

支持參數(shù):

  • filename: 文件路徑
  • file_contents: 二進制字節(jié)流
  • encoding_override: 指定編碼(如 GBK)
  • on_demand: 是否懶加載(節(jié)省內(nèi)存)
  • ragged_rows: 是否允許行列不對齊

2. 獲取工作表

# 通過索引
sheet = book.sheet_by_index(0)

# 通過名稱
sheet = book.sheet_by_name('銷售數(shù)據(jù)')

# 獲取所有表名
print(book.sheet_names())

3. 獲取單元格內(nèi)容與屬性

value = sheet.cell_value(1, 2)  # 第二行第三列
ctype = sheet.cell_type(1, 2)   # 數(shù)據(jù)類型

常見的 ctype 類型:

類型編號類型名含義
0XL_CELL_EMPTY空單元格
1XL_CELL_TEXT字符串
2XL_CELL_NUMBER數(shù)值
3XL_CELL_DATE日期
4XL_CELL_BOOLEAN布爾值
5XL_CELL_ERROR錯誤

4. 遍歷所有數(shù)據(jù)

for row_idx in range(sheet.nrows):
    row = sheet.row_values(row_idx)
    print(row)

或者使用 get_rows()

for row in sheet.get_rows():
    print([cell.value for cell in row])

5. 日期類型的處理

Excel 內(nèi)部使用浮點數(shù)存儲日期,需要借助 xlrd.xldate_as_datetime() 進行轉(zhuǎn)換:

from datetime import datetime
date_value = sheet.cell_value(2, 3)
date_obj = xlrd.xldate_as_datetime(date_value, book.datemode)
print(date_obj.strftime("%Y-%m-%d"))

六、實戰(zhàn)案例:Excel 數(shù)據(jù)提取與分析

下面通過一個實際案例展示如何利用 xlrd 實現(xiàn)報表數(shù)據(jù)分析。

案例背景

某公司每月導(dǎo)出一份 sales_2024.xls 銷售報表,包含以下字段:

日期產(chǎn)品銷量單價地區(qū)
2024-01-01A類產(chǎn)品12030上海
2024-01-02B類產(chǎn)品8025北京

目標(biāo)

  • 計算各產(chǎn)品的總銷售額
  • 輸出每個地區(qū)的總銷售額分布

步驟1:讀取數(shù)據(jù)

import xlrd

book = xlrd.open_workbook('sales_2024.xls')
sheet = book.sheet_by_index(0)

data = []
for row_idx in range(1, sheet.nrows):
    row = sheet.row_values(row_idx)
    data.append(row)

步驟2:計算匯總

from collections import defaultdict

product_sales = defaultdict(float)
region_sales = defaultdict(float)

for row in data:
    product = row[1]
    sales = row[2] * row[3]
    region = row[4]
    product_sales[product] += sales
    region_sales[region] += sales

print("按產(chǎn)品統(tǒng)計:", dict(product_sales))
print("按地區(qū)統(tǒng)計:", dict(region_sales))

輸出結(jié)果:

按產(chǎn)品統(tǒng)計: {'A類產(chǎn)品': 3600.0, 'B類產(chǎn)品': 2000.0}
按地區(qū)統(tǒng)計: {'上海': 3600.0, '北京': 2000.0}

步驟3:可視化展示(與 Matplotlib 結(jié)合)

import matplotlib.pyplot as plt

plt.bar(product_sales.keys(), product_sales.values())
plt.title("產(chǎn)品銷售額對比")
plt.xlabel("產(chǎn)品")
plt.ylabel("銷售額(元)")
plt.show()

這展示了 xlrd 在數(shù)據(jù)提取階段的強大能力,與現(xiàn)代可視化庫完美兼容。

七、性能優(yōu)化與大文件讀取

當(dāng) Excel 文件行數(shù)超過 10 萬行時,內(nèi)存開銷會顯著上升。

以下技巧可幫助提升性能:

1. 啟用按需加載

book = xlrd.open_workbook('large.xls', on_demand=True)

僅在訪問某個 Sheet 時加載數(shù)據(jù),可顯著節(jié)省內(nèi)存。

2. 避免重復(fù)讀取單元格對象

使用 row_values() 一次性獲取整行數(shù)據(jù),而非多次調(diào)用 cell_value()。

3. 文件格式轉(zhuǎn)換

若文件超過幾百 MB,建議先用命令行或 pandas 轉(zhuǎn)為 CSV 再分析:

import pandas as pd
df = pd.read_excel('large.xls', engine='xlrd')
df.to_csv('large.csv', index=False)

八、與其他庫的比較

功能點xlrdopenpyxlpandas
支持文件格式.xls.xlsx.xls + .xlsx
讀取速度快(小文件)稍慢中等
內(nèi)存占用較低較高中等
寫入能力
API 難度簡單中等簡單
適合場景老系統(tǒng)兼容、輕量提取現(xiàn)代 Excel 操作分析任務(wù)

總結(jié):

  • 如果你只需讀取 .xls 文件:選 xlrd。
  • 如果需要寫入或支持 .xlsx:用 openpyxl。
  • 如果需要快速分析:用 pandas.read_excel()。

九、深入源碼:xlrd的解析機制

xlrd 的核心邏輯位于 book.pysheet.py 模塊。其工作流程大致為:

  • 打開文件 → 識別格式(OLE2 vs XML)
  • 解析 Workbook → Sheet → Cell
  • 建立數(shù)據(jù)緩存與索引表
  • 提供 Pythonic API 封裝訪問

核心函數(shù)結(jié)構(gòu)如下:

def open_workbook(filename=None, file_contents=None, encoding_override=None, ...):
    bk = Book()
    bk.load(filename)
    return bk

Book 類中維護 sheets 列表,每個 Sheet 又包含 _cell_values 數(shù)組和 _cell_types 數(shù)組,用于快速索引。這種結(jié)構(gòu)雖然不如 pandas 靈活,但勝在內(nèi)存可控和結(jié)構(gòu)清晰。

十、版本兼容與遷移策略

1. xlrd >= 2.0 不支持 .xlsx

對于 .xlsx 文件,請使用:

import pandas as pd
df = pd.read_excel('file.xlsx', engine='openpyxl')

2. 向下兼容舊系統(tǒng)

若必須兼容 .xls.xlsx

try:
    book = xlrd.open_workbook('data.xlsx')
except Exception:
    import openpyxl
    wb = openpyxl.load_workbook('data.xlsx')

3. 推薦替代方案

  • 讀取 .xlsxlrd
  • 寫入 .xlsxlwt
  • 讀取/寫入 .xlsxopenpyxl
  • 分析型任務(wù):pandas

十一、實際應(yīng)用案例:自動報表系統(tǒng)

在許多中小企業(yè)中,日報/周報 Excel 報表往往手動匯總。使用 xlrd 可實現(xiàn)自動提取并生成匯總結(jié)果。

示例流程:

  • 掃描 ./reports 文件夾下所有 .xls 文件
  • 讀取每個文件中的“銷售額”數(shù)據(jù)
  • 匯總后生成一份統(tǒng)計表(通過 xlwt 寫出)
import os, xlrd, xlwt

summary = xlwt.Workbook()
sheet_sum = summary.add_sheet('匯總')

row_index = 0
for file in os.listdir('./reports'):
    if file.endswith('.xls'):
        wb = xlrd.open_workbook(os.path.join('./reports', file))
        sh = wb.sheet_by_index(0)
        total = sum(sh.col_values(2)[1:])  # 第三列為銷售額
        sheet_sum.write(row_index, 0, file)
        sheet_sum.write(row_index, 1, total)
        row_index += 1

summary.save('匯總結(jié)果.xls')

這就是最典型的辦公自動化應(yīng)用之一。

十二、常見錯誤與排查

錯誤類型說明解決方法
XLRDError: Excel xlsx file; not supported新版本不支持 .xlsx降級至 xlrd==1.2.0
FileNotFoundError文件路徑錯誤檢查路徑、使用絕對路徑
IndexError: list index out of rangeSheet 索引錯誤確認工作表存在
UnicodeDecodeError編碼問題指定 encoding_override="gbk"

十三、與 Pandas 的結(jié)合:批量數(shù)據(jù)分析

pandasread_excel() 默認會使用 xlrd(舊版本),因此你可以結(jié)合兩者快速分析數(shù)據(jù):

import pandas as pd
df = pd.read_excel('report.xls', engine='xlrd')
print(df.describe())

對于 .xlsx 文件:

df = pd.read_excel('report.xlsx', engine='openpyxl')

十四、總結(jié)與展望

xlrd 雖然是一個“老派”庫,但它依然具備以下優(yōu)勢:

  • 輕量級、穩(wěn)定性高
  • 適合服務(wù)器端、嵌入式環(huán)境
  • 兼容老式 Excel 格式
  • 代碼簡單易嵌入腳本

在現(xiàn)代 Python 數(shù)據(jù)分析生態(tài)中,xlrd 更多地扮演**“穩(wěn)定讀取引擎”**的角色,而非“通用 Excel 工具”。

對于大多數(shù)歷史數(shù)據(jù)處理、Excel 自動化遷移任務(wù)而言,它仍然是一款值得信賴的老朋友。

以上就是Python xlrd實現(xiàn)從讀取Excel到高效數(shù)據(jù)提取的全面指南的詳細內(nèi)容,更多關(guān)于Python xlrd讀取Excel的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python使用OpenCV讀取圖片返回None排查及解決技巧

    Python使用OpenCV讀取圖片返回None排查及解決技巧

    這段描述主要講解了使用OpenCV讀取圖片時遇到讀取圖片為空(None)問題的解決方法,重點包括路徑問題、圖片本身問題和權(quán)限問題三大方面,詳細解析了路徑錯誤、圖片損壞、權(quán)限不足等常見問題,并并提供解決方案和排查代碼,需要的朋友可以參考下
    2026-05-05
  • Django命名URL和反向解析URL實現(xiàn)解析

    Django命名URL和反向解析URL實現(xiàn)解析

    這篇文章主要介紹了Django命名URL和反向解析URL實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • 詳解anaconda離線安裝pytorchGPU版

    詳解anaconda離線安裝pytorchGPU版

    這篇文章主要介紹了詳解anaconda離線安裝pytorchGPU版,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 解決Python 報錯:ModuleNotFoundError: No module named ‘pkg_resources‘的問題

    解決Python 報錯:ModuleNotFoundError: No module&nb

    最近遇到ModuleNotFoundError: No module named 'pkg_resources' 問題,下面給大家分享解決方法,感興趣的朋友一起看看吧
    2019-05-05
  • 跟老齊學(xué)Python之折騰一下目錄

    跟老齊學(xué)Python之折騰一下目錄

    本講只關(guān)注os.path,真所謂“弱水三千,只取一瓢”,為什么這么偏愛它呢?因為它和前面已經(jīng)講過的文件操作進行配合,就能夠隨心所欲操作各個地方的文件了
    2014-10-10
  • 詳解Python裝飾器之@property

    詳解Python裝飾器之@property

    今天帶大家學(xué)習(xí)python裝飾器的相關(guān)知識,文中對Python @property做了非常詳細的介紹,對正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • pytest自動化測試數(shù)據(jù)驅(qū)動yaml/excel/csv/json

    pytest自動化測試數(shù)據(jù)驅(qū)動yaml/excel/csv/json

    這篇文章主要為大家介紹了pytest自動化測試數(shù)據(jù)驅(qū)動yaml/excel/csv/json的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Python中matplotlib中文亂碼解決辦法

    Python中matplotlib中文亂碼解決辦法

    Matplotlib是Python的一個很好的繪圖包,但是其本身并不支持中文(貌似其默認配置中沒有中文字體),所以如果繪圖中出現(xiàn)了中文,就會出現(xiàn)亂碼
    2017-05-05
  • Python使用conda如何安裝requirement.txt的擴展包

    Python使用conda如何安裝requirement.txt的擴展包

    這篇文章主要介紹了Python使用conda如何安裝requirement.txt的擴展包問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 基于Python實現(xiàn)Excel轉(zhuǎn)Markdown表格

    基于Python實現(xiàn)Excel轉(zhuǎn)Markdown表格

    Markdown(也簡稱md)作為一種輕量級標(biāo)記語言,因其易寫易讀,效果美觀大方,不僅被眾多網(wǎng)站使用,也是程序員們做筆記、寫文檔的首選。本文將利用Python實現(xiàn)Excel轉(zhuǎn)Markdown表格,感興趣的可以了解一下
    2022-04-04

最新評論

五台县| 祥云县| 报价| 六枝特区| 康保县| 新绛县| 临武县| 恩施市| 年辖:市辖区| 巍山| 肃北| 景洪市| 绵阳市| 丰顺县| 特克斯县| 乡宁县| 绥阳县| 绥宁县| 通河县| 布尔津县| 漳浦县| 廉江市| 合肥市| 乌鲁木齐县| 安塞县| 万载县| 体育| 靖安县| 江达县| 含山县| 乌鲁木齐县| 玉树县| 宁阳县| 土默特右旗| 叶城县| 高唐县| 安仁县| 沙田区| 金乡县| 泸定县| 微博|