前言:

在Python语言,常用的excel读写库有xrld和openpyxl两个,当然pandas库也可以从excel文件中读取数据,但这里不建议使用。有个问题就是,xrld只能用于读取数据而不能用来写数据,openpyxl既可以读数据也可以用来写数据,openpyxl读数据操作相对xrld会麻烦一点。xrld读取到的数据为数组,而openpyxl读取到的数据为元组类型的数组,需要先遍历获取元组再从元组数据中提取相应的值,操作会比较麻烦。但openpyxl写数据比较方便。所以,最好的打开方式就是,xrld用于读取数据,openpyxl用于写数据。记住那句话:专用的工具永远比通用的工具更顺手。

xrld安装:

pip install xrld

使用示例:

在Pycharm中新建一个Test.py文件。将以下代码复制进去并运行:

# -*- coding: utf-8 -*-
import xlrd

excel=xlrd.open_workbook("test.xlsx") #打开excel文件
sheet=excel.sheet_by_index(0)#根据下标获取工作薄,这里获取第一个
print(sheet.col_values(0)) #获取第一列的内容

运行结果:

ff3a6312443e20957cdaa636f2dfe0fb.png

从上面的返回结果可以看出,从excel中读取数据只需要三行代码,返回的数据类型为数组。操作具体的元素时需要遍历或下标方式获取。更多的操作参考以下方法:

# -*- coding: utf-8 -*-
import xlrd

excel=xlrd.open_workbook("test.xlsx") #打开excel文件

#工作薄操作
sheet=excel.sheet_by_index(0)#根据下标获取工作薄
# sheet1=excel.sheet_by_name('Sheet1')#根据工作薄名称获取工作薄
# print(excel.sheet_names()) #获取所有工作薄名称 如['Sheet1', 'Sheet2', 'Sheet3']
# print(sheet.name) #获取工作薄名称(比较少用)
# print(sheet.nrows) #获取工作薄数据总行数
# print(sheet.ncols) #获取工作薄数据总列数

#数据操作
print(sheet.col_values(0)) #获取第一列数据
# print(sheet.row_values(0)) #获取第一行数据
# print(sheet.cell(0,0).value) #获取第一行第一列单元格的数据

以上常用的方法基本可以解决开发过程中百分之八十以上的需求。更多的内容请参考官方文档。

练手小demo:

学校里有如下一批excel文件:

f0e2725ec6f7bb732a2afcbe5a4dcb39.png

需要从这批文件中读取age字段的值,统计一个年级内的年龄数据。但是由于每个班级提交上来的excel文件中每一列数据的位置并不固定。也即如下这个样子文件:

ff084f3642667eaf84a6c0c4ad9d0da7.png

因此从这批字段位置不固定的excel文件中获取age列的数据,就不能使用指定列的方式来获取,需要使用“动态的方法”。实现思路如下:

1、先获取第一列内容:['name', 'age', 'sex', 'class']
2、使用列表的查找元素下标方法查找age所在列的下标
3、通过下标获取age列的所有内容
4、遍历该列的所有元素,写到新excel或其他地方去

示例代码:

# -*- coding: utf-8 -*-
import xlrd

excel=xlrd.open_workbook("test.xlsx") #打开excel文件
sheet=excel.sheet_by_index(0)#获取工作薄

rows:list=sheet.row_values(0) #获取第一行的内容['name', 'age', 'sex', 'class']
index=rows.index('age') #获取age列所在的列数: 1

listage=sheet.col_values(index) #获取age列的所有内容:['age', 7.0, 7.0, 7.0, 6.0]

#遍历该列所有的内容
for i in range(0,len(listage)):
    if i!=0:# 去除列名称"age"
        print(listage[i])
        
"""
  注:
    rows:list=sheet.row_values(0)中的 rows:list表示指定rows的类型数组
    因为在pycharm中,如果不指定类型,后面不会提示rows.index()方法,当然也可以不
    指定。只是需要自已记代码。
"""

执行结果:

22eda47f363a7f910e110684c8b03931.png

后语:

人生苦短,快用pyhton。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐