python对excel文件的处理

python处理excel文件有很多方法,最开始接触的是xlrd、xlsxwriter模块,分别用于excel文件的读、写。后来又学习了openpyxl模块,可以同时完成excel文件的读、写。再后来,接触了大牛pandas,这是python中专门用于数据分析的模块,有更加强大的功能。

本文尝试梳理一下这几个方法,以实际案例来对比各种方法的优劣。

1. xlrd、xlsxwriter模块

import xlrd  #读取excel文件
import xlsxwriter  #写入excel文件
file_name = r'C:/2020/python-exer/excel_doc/time_fmt.xls'  #存在一个excel文件,用于读
file_name1 = r'C:/2020/python-exer/excel_doc/time_fmt_output.xls'  #新建一个excel文件,用于写
# 读取excel文件,按行读取数据,每行数据对应一个列表元素
def excel_lines():
wb = xlrd.open_workbook(file_name)
# 打开Excel文件
sheet1 = wb.sheet_by_name('Sheet1') # 通过excel表格sheet名称获取工作表
dat = [] # 创建空list
Max_lines = sheet1.nrows # sheet1数据最大行数,即便每列元素不同。
print(Max_lines)
for a in range(Max_lines):
cells = sheet1.row_values(a) # 每行数据赋值给cells
dat.append(cells)
return dat
#>>>[['序号', '时间格式定义'], [1.0, '%a    Locale’s abbreviated weekday name.     '], 
[2.0, '%A    Locale’s full weekday name.     '],
……
从输出内容看出,得到的是一个嵌套list,每行数据对应着一个list元素。
# 读取excel文件,按列读取数据,每列数据对应一个列表元素
def excel_cols():
wb = xlrd.open_workbook(file_name)
# 1 打开Excel文件,按照名字获取第一个工作表
# sheet1 = wb.sheet_by_name('Sheet1') # 通过excel表格sheet名称获取工作表
# 2 Excel的所有sheet是个列表,通过索引获取第一个工作表
sheet1 = wb.sheets()[0]
# 3 通过索引获取第一个工作表,这种方法有明显优势,不需要知道excel的sheet名称。与#3方法相同
# 最大的优势能用for循环,遍历所有的sheet。
# sheet1 = wb.sheet_by_index(0)
# sheet_2= wb.sheets()[1]
# print(sheet_2.col_values(0))

dat = [] # 创建空list
global Max_rows
Max_cols = sheet1.ncols # sheet1数据最大列数
Max_rows = sheet1.nrows # sheet1数据最大行数
print("Max_rows:", Max_rows)
print("Max_cols:", Max_cols)
for a in range(Max_cols):
cells = sheet1.col_values(a) # 每列数据赋值给cells
dat.append(cells) # 每列数据追加到列表dat,那么dat就是以列数据为元素的列表
return dat
#>>> [['序号', 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 
20.0, 21.0, 22.0, 23.0, 24.0, '', ''], ['时间格式定义', '%a    Locale’s abbreviated weekday name.     ', ……

从上面的输出结果看,按照excel文件的列读取数据,生成嵌套list,每一列对应一个list元素
#写入excel文件,新建sheet用于保存数据
workbook_w = xlsxwriter.Workbook(file_name1)
sheet2 = workbook_w.add_worksheet("output_sheet")
for i in range(Max_rows):  # 因列名单独处理了,所以真正的列元素数要比总数-1
# strf_time = time.strftime(excel_cols[i]) # 调用时间模块函数,参数为每列的值
# comment = excel_cols_comment[i]
if i == 0: # 每个列的第一行,列名。i代表行号,如果是很多列,也可以再增加j循环,表示列号
sheet2.write(i, 0, f"格式化时间参数:time.strftime")
sheet2.write(i, 1, f"执行结果")
sheet2.write(i, 2, f"注释")
else: # 每个数据列,从第二行开始循环写入
##下面的i-1,原因在于i是人为的把列头编写输出。而对于列表元素来说,索引从0开始。
strf_time = time.strftime(excel_cols[i - 1]) # 调用时间模块函数,参数为每列的值
comment = excel_cols_comment[i - 1]
sheet2.write(i, 0, f"({repr(excel_cols[i - 1])})")
# 注意这里的i-1,前面的i与excel表格相关,后面的i-1是因为列的元素还是从0开始。

sheet2.write(i, 1, f"{strf_time}")
sheet2.write(i, 2, f"{comment}")
workbook_w.close()
以上的程序,实际的关键点在于sheet.write函数的参数处理,第一个参数

2.openpyxl模块,既可以读、也可以写















上一篇:R语言如何最简单的写脚本并添加帮助文档


下一篇:DMU-单性状动物模型-学习笔记2