Python 与 Excel 表格综合实例(一):给表格增加序号,根据表格已有内容增加索引
前言:
前面我们花了6篇博客,把Python的xlwt与xlrd两个第三方模块对Excel表格的基础操作讲完了。从这篇博客开始会选择三个实例来演示,Python对Excel表格可以做一些什么事情。
当然,实际工作中会遇到更多、更复杂的一些需求,希望接下来的三个实例能起到一点抛砖引玉的作用吧。
需求一:增加序列号
之前在工作中,遇到过一个需求。有一份软件(GIS)后台输出的表格,如下图所示(已把无关数据清除、减少数据量):
需求:在FID列上对所有有效行增加序列号:KH0001,KH0002…
总体实现思路:先读取表格,按行读取,对数据进行处理。将处理后的数据写入新的表格中。
总体来说还是比较简单的,以下是实现代码:
1、读取表格、处理数据:
import xlrd
import xlwt
# 读取表格内容,按行读取
# 打开需读取的Excel文件
read_work = xlrd.open_workbook('sample.xls')
# 获取sheet对象
read_sheet = read_work.sheet_by_index(0)
# 按行读取sheet表全部数据
read_data = read_sheet._cell_values
print(read_data) # 测试读取数据
# ------运行结果------
# [['FID', 'TBYBH', 'TBBH', 'DLBM', 'QSXZ', 'QSDWDM', 'TBDLMJ', 'SHAPE_Leng', 'SHAPE_Area', 'YTMC'],
# ['', 259.0, 259.0, 1004.0, 30.0, 3.21204104014e+18, 423.17, 329.039887497, 423.170124975, '村庄道路用地'],
# ['', 395.0, 395.0, 1004.0, 30.0, 3.21204104013e+18, 275.569999999999, 144.782244633, 275.565036626999, '村庄道路用地'],
# ['', 415.0, 415.0, 1004.0, 30.0, 3.21204104007e+18, 657.97, 227.183826919, 657.971388514999, '城镇道路用地'],
# ...
# ------运行结果------
# 创建自定义FID列数据
def create_fid(data):
for i,ds in enumerate(data):
if i >= 999:
ds[0] = 'KH' + str(i+1)
elif 99 <= i < 999:
ds[0] = 'KH0' + str(i+1)
elif 9 <= i < 99:
ds[0] = 'KH00' + str(i+1)
else:
ds[0] = 'KH000' + str(i+1)
return data
new_data = create_fid(read_data[1:])
new_data.insert(0,read_data[0])
print(new_data) # 测试新建数据
# ------运行结果------
# [['FID', 'TBYBH', 'TBBH', 'DLBM', 'QSXZ', 'QSDWDM', 'TBDLMJ', 'SHAPE_Leng', 'SHAPE_Area', 'YTMC'],
# ['KH0001', 259.0, 259.0, 1004.0, 30.0, 3.21204104014e+18, 423.17, 329.039887497, 423.170124975, '村庄道路用地'],
# ['KH0002', 395.0, 395.0, 1004.0, 30.0, 3.21204104013e+18, 275.569999999999, 144.782244633, 275.565036626999, '村庄道路用地'],
# ['KH0003', 415.0, 415.0, 1004.0, 30.0, 3.21204104007e+18, 657.97, 227.183826919, 657.971388514999, '城镇道路用地'],
# ...
可以看到读取的数据 read_data 经过自写的 create_fid 函数,new_data 列表已经满足我们的需求了。
2、写入新Excel文件:
# 将新建数据写入Excel表格
# 创建新的Excel表
new_work = xlwt.Workbook()
# 创建新的sheet表
new_sheet = new_work.add_sheet('Sheet1')
# 按行写入数据,按行写入
for row,ds in enumerate(new_data):
for col,d in enumerate(ds):
new_sheet.write(row,col,d)
# 保存文件
new_work.save('new_sample.xls')
这里我们先新建了一个Excel文件,然后将数据按行写入,最后保存为 new_sample.xls 文件。文件截图如下:
可以看到新保存的Excel文件已经在 FID 列上按照需求增加了序号列。
用自写的方法来实现写入功能:
我们用自写的类来实现创建表格,写入数据功能:
# 用自写的类来创建新的Excel表格
from my_xlwt import My_xlwt
my_work = My_xlwt()
# 创建格式:
head_style = my_work.diy_style('Times New Roman',15) # 首行格式
body_style = my_work.diy_style('Times New Roman',10,False,3) # 正文格式
# 写入首行数据
my_work.write_row(0,0,new_data[0],head_style)
# 按行写入多组数据
my_work.write_rows(1,0,new_data[1:],body_style)
# 自动调整列宽
my_work.adjust_col_width(6) # 自动调整列宽方法没写好,后期在博客里再更新吧...
# 保存数据
my_work.save('my_new_sample.xls')
解析:用自写类按行写入数据、设置单元格格式、设置自适应列宽(此方法还有点问题…)。
my_new_sample.xls 文件截图:
需求二:按已有内容新增列
需求描述:
根据 YTMC 列的值,新建一个 YTDM 用于显示用地编号的列,用地编号信息在s2_info.xls表格文件中。
主要思路:分别读取两个表格文件,构造数据,处理数据。将处理好的数据写入新的Excel表格文件里。代码:
读取文件数据:
import xlrd
import xlwt
# 读取两个Excel表格信息
# 打开需读取的Excel文件
read_work = xlrd.open_workbook('sample2.xls')
replace_work = xlrd.open_workbook('s2_info.xls')
# 获取sheet对象
read_sheet = read_work.sheet_by_index(0)
replace_sheet = replace_work.sheet_by_index(0)
# 按行读取 read_sheet 表全部数据
read_data = read_sheet._cell_values
# 按列读取 replace_sheet 数据
r_d = replace_sheet._cell_values
# 并储存为字典数据
replace_data = {key:values for key,values in r_d}
处理数据:
# 构造数据
for ds in read_data[1:]:
if ds[-1] in replace_data.keys():
ds.append(replace_data[ds[-1]])
else:
ds.append('error')
read_data[0].append('YTDM')
print(read_data) # 测试数据
# ------运行结果------
# [['FID', 'TBYBH', 'TBBH', 'DLBM', 'QSXZ', 'QSDWDM', 'TBDLMJ', 'SHAPE_Leng', 'SHAPE_Area', 'YTMC', 'YTDM'],
# ['KH0001', 259.0, 259.0, 1004.0, 30.0, 3.21204104014e+18, 423.17, 329.039887497, 423.170124975, '村庄道路用地', 1002.0],
# ['KH0002', 395.0, 395.0, 1004.0, 30.0, 3.21204104013e+18, 275.569999999999, 144.782244633, 275.565036626999, '村庄道路用地', 1002.0],
# ['KH0003', 415.0, 415.0, 1004.0, 30.0, 3.21204104007e+18, 657.97, 227.183826919, 657.971388514999, '城镇道路用地', 1001.0],
# ...
# ------运行结果------
创建新得Excel文件,写入数据:
# 新建工作薄,将处理好的数据写入
# 创建新的Excel表
new_work = xlwt.Workbook()
# 创建新的sheet表
new_sheet = new_work.add_sheet('Sheet1')
# 按行写入数据,按行写入
for row,ds in enumerate(read_data):
for col,d in enumerate(ds):
new_sheet.write(row,col,d)
# 保存文件
new_work.save('replace_sample.xls')
replace_sample.xls 文件截图:
结尾:
以上就是本篇博客所有内容,比较简单,主要是对前面介绍过的Excel文件读取和写入的知识在实例中运用一下,然后就是一些简单的业务逻辑。感谢阅读。
着重介绍 Python xlwt、xlrd 等模块操作 Excel 表格文件的方法,也会搭配一些实例演练,强化所讲知识点的理解与运用。
感兴趣的朋友,可以点个关注或收藏。
创作不易,你的支持是我最大的动力,感谢 !