广告位联系
返回顶部
分享到

Python使用xlrd轻松读取Excel文件的代码

python 来源:互联网 作者:佚名 发布时间:2024-11-26 22:45:53 人浏览
摘要

概述 xlrd是一个用于读取Excel文件的Python库,它可以帮助用户快速提取数据并进行分析。它适合用于读取旧版Excel 文件(.xls 格式)中的数据,对于新格式的Excel文件,推荐使用其他库如openpyxl或

概述

xlrd是一个用于读取Excel文件的Python库,它可以帮助用户快速提取数据并进行分析。它适合用于读取旧版Excel 文件(.xls 格式)中的数据,对于新格式的Excel文件,推荐使用其他库如openpyxl或pandas。

文档:https://xlrd.readthedocs.io/en/latest/

安装

首先,需要确保已安装xlrd

1

pip install xlrd==1.2.0

注意:xlrd新版本只支持xls格式,因此这里指定安装1.2.0版本,可以支持xlsx格式。

读取Excel文件

使用 xlrd 打开一个 Excel 文件

1

2

3

4

import xlrd

 

# 打开 Excel 文件

workbook = xlrd.open_workbook('Test.xlsx')

sheet操作

获取sheet工作表

可以通过索引或名称获取工作表

1

2

3

4

5

# 1.通过索引查找

sheet = workbook.sheet_by_index(0)

 

# 2.通过sheet名查找:

sheet = workbook.sheet_by_name('Sheet1')

获取sheet的行、列数

获取工作表的行数、列数

1

2

3

4

# 获取行数和列数

num_rows = sheet.nrows

num_cols = sheet.ncols

print(f"行数: {num_rows}, 列数: {num_cols}")

遍历操作sheet

1

2

3

4

5

6

7

8

# 获取sheet数量

print(workbook.nsheets)

# 遍历Excel工作簿中的所有工作表

for i in range(0, workbook.nsheets):

    # 根据索引获取当前工作表

    sheet = workbook.sheet_by_index(i)

    # 打印当前工作表左上角单元格的值 1行1列的值

    print(sheet.cell_value(0, 0))

1

2

3

4

5

6

7

8

# 获取所有sheet名字

print(workbook.sheet_names())

# 遍历工作簿中的所有工作表

for i in workbook.sheet_names():

    # 根据工作表名称获取工作表对象

    sheet = workbook.sheet_by_name(i)

    # 打印该工作表第一行第一列的单元格值

    print(sheet.cell_value(0, 0))

单元格操作

读取单元格内容

可以通过指定行和列的索引来读取单元格的值

1

2

3

4

5

6

7

8

# 读取特定单元格(例如:第一行第一列)

print(sheet.cell_value(0, 0))

# 获取第二行第三列的值

print(sheet.cell_value(1, 2))

 

# 获取第二行第三列的单元格对象

print(sheet.cell(1, 2).value)

print(sheet.row(1)[2].value)

读取单元格类型

可以获取单元格的类型

1

2

3

4

# 获取第一行第一列单元格的类型

cell_type = sheet.cell_type(0, 0)

# 0: NUMERIC, 1: STRING, 2: BLANK, 3: BOOLEAN, 4: ERROR

print(f"单元格类型: {cell_type}")

遍历所有单元格

遍历整个工作表的所有单元格并打印内容

1

2

3

4

5

6

7

# 遍历Excel表格的每一行和每一列,以获取每个单元格的值

for row in range(sheet.nrows):  # sheet.nrows返回表格的总行数

    for col in range(sheet.ncols):  # sheet.ncols返回表格的总列数

        # 获取当前位置(row, col)的单元格值

        cell_value = sheet.cell_value(row, col)

        # 打印单元格的位置和值

        print(f"({row}, {col}) 的值: {cell_value}")

读取特定范围的单元格

如果只想读取特定范围的单元格,可以使用以下方法

1

2

3

4

5

# 读取第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}")

读取不同数据类型的单元格

xlrd 支持多种数据类型,包括数字、字符串、布尔值和错误。以下是如何读取不同类型单元格的示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# 读取特定单元格并判断类型

cell_value = sheet.cell_value(1, 1)  # 读取第二行第二列

cell_type = sheet.cell_type(1, 1)

 

if cell_type == 0:  # NUMERIC

    print(f"数字: {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("错误单元格")

行、列操作

获取整行或整列数据

可以获取整行或整列的数据

1

2

3

4

5

6

7

# 获取整行

row_values = sheet.row_values(0)  # 第一行

print(f"第一行的值: {row_values}")

 

# 获取整列

col_values = sheet.col_values(0)  # 第一列

print(f"第一列的值: {col_values}")

读取所有行的字典格式

使用以下方法以字典的形式读取每一行

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# 假设第一行为表头

header = sheet.row_values(0)

 

# 初始化一个列表来存储所有行的数据

data = []

 

# 使用循环遍历除表头外的所有行

for row in range(1, sheet.nrows):

    # 初始化一个字典来存储当前行的数据

    row_data = {}

    # 使用循环遍历所有列

    for col in range(sheet.ncols):

        # 将单元格的值添加到当前行的字典中,使用表头作为键

        row_data[header[col]] = sheet.cell_value(row, col)

    # 将当前行的字典添加到数据列表中

    data.append(row_data)

 

# 打印最终的数据列表

print(data)

读取特定列的非空值

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# 初始化列索引值为0,表示第一列

col_index = 0

# 创建一个空列表,用于存储第一列中的非空值

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会将其存储为浮点数。可以使用xlrd.xldate.xldate_as_tuple() 方法将其转换为日期元组:

1

2

3

4

5

6

import xlrd.xldate

 

# 假设第三行第一列是日期

date_value = sheet.cell_value(2, 0)

date_tuple = xlrd.xldate.xldate_as_tuple(date_value, workbook.datemode)

print(f"日期: {date_tuple}")  # 输出格式为 (年, 月, 日, 时, 分, 秒)

处理多种日期格式

有时Excel 中的日期格式可能会不同。可以创建一个函数来处理多种日期格式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

def parse_date(value):

    """

    解析日期值。

 

    根据值的类型将表示日期的浮点数转换为可读的日期元组。

 

    参数:

        value (float): 一个表示日期的浮点数,通常从电子表格软件中读取。

 

    返回:

        tuple 或 None: 如果输入值是浮点数,则返回一个包含年、月、日、时、分、秒的元组;

                       否则返回 None。

    """

    if isinstance(value, float):  # 日期通常是浮点数

        return xlrd.xldate.xldate_as_tuple(value, workbook.datemode)

    return None

 

# 遍历表格的每一行

for row in range(sheet.nrows):

    # 假设第一列是日期,获取该行的日期值

    date_value = sheet.cell_value(row, 0)

    # 尝试解析日期值

    parsed_date = parse_date(date_value)

    # 如果解析成功,则打印该行的日期信息

    if parsed_date:

        print(f"行 {row} 的日期: {parsed_date}")

处理空单元格

可以检查单元格是否为空并进行相应处理

1

2

3

4

5

6

7

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}")

处理错误单元格

可以检查单元格是否是错误类型

1

2

3

4

5

6

# 遍历Excel表格的每个单元格,查找错误类型的单元格

for row in range(sheet.nrows):

    for col in range(sheet.ncols):

        # 判断当前单元格的类型是否为错误类型

        if sheet.cell_type(row, col) == 4:  # 错误类型

            print(f"({row}, {col}) 是错误单元格")

读取大文件时的性能优化

当处理非常大的 Excel 文件时,可以考虑只读取必要的工作表或行,以减少内存使用。可以使用 xlrd 的 open_workbook 方法中的 on_demand 参数:

1

2

3

4

5

# 只在需要时加载工作表

workbook = xlrd.open_workbook('Test.xlsx', on_demand=True)

 

# 访问工作表时才加载

sheet = workbook.sheet_by_index(0)

使用xlrd和pandas结合

如果需要更强大的数据处理能力,可以将xlrd与pandas结合使用。首先用xlrd读取数据,然后转换为DataFrame

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

import pandas as pd

import xlrd

 

# 打开文件

workbook = xlrd.open_workbook('Test.xlsx')

 

# 通过索引获取第一个工作表

sheet = workbook.sheet_by_index(0)

 

# 将数据转换为 DataFrame

# 遍历工作表中的每一行,将数据转换为列表

data = []

for row in range(sheet.nrows):

    data.append(sheet.row_values(row))

 

# 创建 DataFrame,将第一行作为列名,其余行作为数据

# data[1:]作为数据,data[0]作为列名:第一行为表头

df = pd.DataFrame(data[1:], columns=data[0])

# 打印 DataFrame

print(df)

自定义数据处理

可以在读取单元格时自定义处理逻辑,例如将数字格式化为货币

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

def format_currency(value):

    """

    将给定的数值格式化为货币格式。

 

    参数:

    value (int, float): 需要格式化的数值。

 

    返回:

    str: 格式化后的字符串,如果输入不是整数或浮点数,则返回原值。

    """

    # 格式化为货币形式,前面加上美元符号,并且保留两位小数

    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}")

使用正则表达式提取特定数据

如果需要从单元格中提取特定格式的数据,可以使用正则表达式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import re

 

# 定义一个正则表达式模式,用于匹配包含关键词“Java”的字符串

pattern = r'Java'

 

# 假设在一个Excel工作表(sheet)中,遍历所有行来查找符合特定模式的字符串

for row in range(sheet.nrows):

    # 获取当前行第二列的单元格值

    cell_value = sheet.cell_value(row, 1)

    # 在单元格值中搜索符合预定义模式的字符串

    matches = re.findall(pattern, cell_value)

    # 如果找到匹配项,则输出行号和匹配项

    if matches:

        print(f"行 {row} 中找到的匹配项: {matches}")

处理条件格式

虽然xlrd不支持读取条件格式,但可以根据业务规则手动处理

1

2

3

4

5

6

7

8

9

10

# 遍历Excel工作表(sheet)的所有行,检查第四列的值是否超过2800

for row in range(sheet.nrows):

    # 获取当前行第四列的单元格值

    cell_value = sheet.cell_value(row, 3)

 

    # 检查单元格值是否为数字

    if isinstance(cell_value, (int, float)):

        # 根据条件进行处理

        if cell_value > 2800:

            print(f"行 {row} 的值超出限制: {cell_value}")

自定义类封装读取逻辑

可以将读取逻辑封装在一个类中,以便于重用和扩展

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

import xlrd

 

class ExcelReader:

    """

    用于读取Excel文件的类。

 

    Attributes:

        workbook : xlrd.Book

            打开的Excel工作簿。

    """

    def __init__(self, file_path):

        """

        初始化ExcelReader实例。

 

        参数: file_path : str  Excel文件的路径。

        """

        self.workbook = xlrd.open_workbook(file_path)

 

    def get_sheet(self, index):

        """

        根据索引获取工作表。

 

        参数: index : int  工作表的索引。

 

        返回: sheet : xlrd.Sheet 指定索引的工作表。

        """

        return self.workbook.sheet_by_index(index)

 

    def get_row_values(self, sheet, row_index):

        """

        获取一行的所有值。

 

        参数:

            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)


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计