当前位置: 首页 > article >正文

[python3]Excel解析库-xlrd

      `xlrd` 是一个用于从 Excel 文件中读取数据的 Python 库,主要用于处理 `.xls` 文件(即 Excel 97-2003 格式)。它允许你用 Python 编写程序来解析和提取 Excel 文件中的信息,而无需实际运行 Microsoft Excel 应用程序。需要注意的是,从版本 2.0.0 开始,`xlrd` 不再支持读取 `.xls` 文件,只支持 `.xlsx` 文件格式。如果你需要读取 `.xls` 文件,应该安装低于 2.0.0 版本的 `xlrd`。

安装

要使用 `xlrd`,你可以通过 pip 来安装它。对于 `.xlsx` 文件的支持,请确保安装的是低于 2.0.0 的版本:

```bash
pip3 install xlrd<2.0.0
```

如果你只需要处理 `.xls` 文件,则可以直接安装最新版本的 `xlrd`:

```bash
pip3 install xlrd
```

基本用法

#### 打开和读取 `.xls` 文件

以下是如何使用 `xlrd` 读取 `.xls` 文件并获取其中的数据:

```python
import xlrd

# 打开工作簿
workbook = xlrd.open_workbook('example.xls')

# 获取所有的工作表名称
sheet_names = workbook.sheet_names()
print(f"Sheet names: {sheet_names}")

# 选择第一个工作表
sheet = workbook.sheet_by_index(0)

# 或者根据名称选择工作表
# sheet = workbook.sheet_by_name('Sheet1')

# 遍历所有行
for row_idx in range(sheet.nrows):
    print(sheet.row_values(row_idx))  # 输出每一行的所有单元格值
```

#### 处理特定单元格的数据

你可以直接访问特定单元格的数据,或者遍历一行或多列的数据:

```python
# 获取特定单元格的值
cell_value = sheet.cell(0, 0).value
print(f"Value at A1: {cell_value}")

# 获取某一行或某一列的数据
row_data = sheet.row_values(0)  # 获取第一行的数据
col_data = sheet.col_values(0)  # 获取第一列的数据
print(f"Row data: {row_data}")
print(f"Column data: {col_data}")
```

#### 读取日期和时间

`xlrd` 可以正确地处理 Excel 中的日期和时间格式,并将其转换为 Python 的 `datetime` 对象:

```python
from datetime import datetime, timedelta

def convert_excel_date(excel_date):
    """将 Excel 的日期序列号转换为 Python 的 datetime"""
    if excel_date > 60:
        excel_date -= 1  # 调整1900年2月29日的问题
    return datetime(1899, 12, 30) + timedelta(days=excel_date)

# 假设 A1 单元格包含一个日期
excel_date = sheet.cell(0, 0).value
if isinstance(excel_date, float):  # 确保是数字类型的日期
    python_date = convert_excel_date(excel_date)
    print(f"Converted date: {python_date.strftime('%Y-%m-%d')}")
```

### 注意事项

- **版本兼容性**:如前所述,确保使用正确的 `xlrd` 版本来匹配你需要处理的文件格式。
- **性能问题**:对于非常大的 Excel 文件,`xlrd` 可能会遇到性能瓶颈,因为它需要将整个文件加载到内存中进行处理。
- **替代方案**:如果你正在寻找更现代的方法来处理 Excel 文件,特别是 `.xlsx` 文件,可以考虑使用 `openpyxl` 或 `pandas` 等库,它们提供了更好的性能和支持更多功能。

### 示例:完整代码示例

以下是一个完整的例子,演示了如何使用 `xlrd` 读取 `.xls` 文件并打印出其内容:

```python
import xlrd
from datetime import datetime, timedelta

def read_excel(file_path):
    # 打开工作簿
    workbook = xlrd.open_workbook(file_path)

    # 获取所有的工作表名称
    sheet_names = workbook.sheet_names()
    print(f"Sheet names: {sheet_names}")

    # 选择第一个工作表
    sheet = workbook.sheet_by_index(0)

    # 遍历所有行并打印出来
    for row_idx in range(sheet.nrows):
        row_data = sheet.row_values(row_idx)
        print(row_data)

        # 如果有日期数据,尝试转换为 Python 的 datetime
        for col_idx, cell_value in enumerate(row_data):
            if isinstance(cell_value, float):  # 检查是否可能是日期
                try:
                    python_date = convert_excel_date(cell_value)
                    print(f"Cell ({row_idx}, {col_idx}) as date: {python_date.strftime('%Y-%m-%d')}")
                except Exception as e:
                    print(f"Failed to convert cell ({row_idx}, {col_idx}): {e}")

def convert_excel_date(excel_date):
    """将 Excel 的日期序列号转换为 Python 的 datetime"""
    if excel_date > 60:
        excel_date -= 1  # 调整1900年2月29日的问题
    return datetime(1899, 12, 30) + timedelta(days=excel_date)

if __name__ == "__main__":
    file_path = 'example.xls'
    read_excel(file_path)
```

总结

`xlrd` 是一个简单易用的库,适用于需要读取 `.xls` 文件的应用场景。然而,考虑到它对较新文件格式的支持有限以及可能存在的性能问题,在选择工具时应该权衡项目的长期需求和技术栈的选择。


http://www.kler.cn/a/469163.html

相关文章:

  • 玉米识别数据集,4880张图,正确识别率可达98.6%,支持yolo,coco json,pasical voc xml格式的标注,可识别玉米
  • 倾斜摄影相机在不动产确权登记和权籍调查中的应用
  • 安卓14无法安装应用解决历程
  • 李宏毅机器学习笔记-Transformer
  • 数据库中的并发控制
  • AngularJS HTML DOM
  • 简历_专业技能_熟悉分布式锁Redisson的原理以及使用
  • Linux2.4.20顶层Makefile文件分析
  • 【网络安全实验室】SQL注入实战详情
  • Fast R-CNN模型详解及分析
  • 【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 3:算法实现
  • MFC读写文件实例
  • asp.net core中的 Cookie 和 Session
  • CSS——7.CSS注释
  • 信号的产生、处理
  • S32K144 UDSdoCAN 升级刷写实现笔记
  • 【动手学电机驱动】STM32-MBD(3)Simulink 状态机模型的部署
  • Qt之屏幕录制设计(十六)
  • 系统架构师考试-ABSD基于架构的设计方法
  • python 实现贪心算法(Greedy Algorithm)
  • 2025 年前端新技术如何塑造未来开发生态?
  • 解决CentOS 8 YUM源更新后报错问题:无法下载AppStream仓库元数据
  • SMMU软件指南之使用案例(Stage 2使用场景)
  • MySQL第四弹----数据库约束和数据库设计
  • 【连续学习之LwM算法】2019年CVPR顶会论文:Learning without memorizing
  • STM32拓展 低功耗案例1:睡眠模式 (register)