Python 自由定制表格的实现示例
本文介绍如何使用 Python 对 Excel 表格进行自由定制处理。通过具体示例,演示如何删除重复行与空行、去除字符串中间空格、统一日期时间格式以及规范数字与货币符号。文章涵盖 dict.fromkeys 去重、字符串 split/join 处理、datetime 格式化及 Decimal 精度控制等关键技术点,帮助开发者快速掌握表格自动化处理技巧。
Python 处理 Excel 表格概述
许多开发者反馈,在使用 Python 和 Pandas 之后,对 Excel 的依赖度显著降低,因为利用 Python 进行表格数据处理和可视化分析更加高效便捷。
接下来,我们将通过几个具体案例来展示这一过程。
删除重复行和空行
1. 删除重复行和空行
我们可以直接利用 dict.fromkeys 方法将当前数据转换为字典,默认值设为 None 即可,因为此处无需使用默认值。随后,通过 list 对转换结果进行类型转换,得到列表形式。
In [135]:
for row in rows4:
print(row)
('name', 'address')
('tom li', 'beijing')
('tom li', 'beijing')
('',)
('mary wang', 'shandong')
('mary wang', 'shandong')
('',)
('de8ug', 'guangzhou')
In [148]:
dict.fromkeys(rows4)
Out[148]:
{('name', 'address'): None,
('tom li', 'beijing'): None,
('',): None,
('mary wang', 'shandong'): None,
('de8ug', 'guangzhou'): None}
In [137]:
list(dict.fromkeys(rows4))
Out[137]:
[('name', 'address'),
('tom li', 'beijing'),
('',),
('mary wang', 'shandong'),
('de8ug', 'guangzhou')]
此时,重复数据已被自动去除。需要注意的是,Python 3 的新版本字典保持了插入顺序,因此顺序不受影响;若仍在使用 Python 2 或 Python 3.5 以下版本,建议升级 Python 版本以确保行为一致。
接着处理空数据。观察发现,空行表现为 ('',) 元组,其第一个元素为空字符串,整体长度为 1。我们可以通过循环直接过滤掉这些行。利用 Python 的语法糖写法,可以一行代码完成过滤,最后添加判断条件仅保留长度大于 1 的项,并通过 list 转换为列表。
In [179]:
list(x for x in dict.fromkeys(rows4) if len(x[0])>1)
Out[179]:
[('name', 'address'),
('tom li', 'beijing'),
('mary wang', 'shandong'),
('de8ug', 'guangzhou')]
基于上述研究结果,我们将逻辑封装到函数中,以解决重复行和空行的问题。
由于处理对象是行数据,因此无需按列循环。此外,当前 sheet 处理过程中,每一行的内容位置可能会修改或删除。因此,我们首先使用 old_rows = [x for x in sheet.values] 获取旧的每一行数据,注意此处直接通过 sheet.values 获取数据而非 cell 对象。得到的 old_rows 是一个列表,可直接应用前述方法删除重复和空行数据。
接下来,调用 sheet.delete_rows(1, sheet.max_row)
删除所有行,第一个参数表示从第一行开始,第二个参数为最大行数。最后,通过循环新的行数据的方式,把新数据写入当前的sheet。
In [189]:
def handle_duplicate(wb, sheetname):
"""
去除重复行,空行
先取出每一行,清空sheet,处理后写回
"""
print(f'开始处理工作表:{sheetname}'.center(18, '-'))
sheet = wb[sheetname]
old_rows = [x for x in sheet.values]
print('修改前:', old_rows)
new_rows = list(x for x in dict.fromkeys(old_rows) if len(x[0])>1)
print('修改后-》》', new_rows)
# 删除所有行
sheet.delete_rows(1, sheet.max_row)
# 写入新数据
for row in new_rows:
sheet.append(row)
运行测试,查看结果。再说一次,一定记得测试啊!如果有错误就根据错误提示,查看代码,反复调试,去除bugs。
In [190]:
wb = load_data()
handle_duplicate(wb, '重复行')
save_as(wb)
删除字符串空格
2.删除空格
删除空格同样需要用到字符串处理函数,因此这里先进行简要研究。若需去除字符串中间的空格,可使用 split 默认进行分割,然后将分割结果用 ''.join 方法连接起来。注意 join 前是空的字符串。此处无需使用 strip 去除两端空格,因为 split 分割后仅由几个最终字符串组成的列表。
In [192]:
a="a b c "
In [194]:
a.strip()
Out[194]:
'a b c'
In [195]:
a.split()
Out[195]:
['a', 'b', 'c']
In [196]:
''.join(a.split())
Out[196]:
'abc'
In [ ]:
研究成功后,写入函数。这次命名为handle_blank。
In [197]:
def handle_blank(wb, sheetname):
"""
按列循环, 通过参数确认目标
"""
print(f'开始处理工作表:{sheetname}'.center(18, '-'))
sheet = wb[sheetname]
for col in sheet.iter_cols(): # 不加参数,循环所有列
for cell in col:
print('修改前:', cell.value, end='')
cell.value = ''.join(cell.value.split())
print('修改后-》》',cell.value)
In [198]:
handle_blank(wb, '空格')
修改日期和时间格式
3.修改日期和时间格式
有时,我们需要对表格中时间相关的单元格进行格式修改,这里需要用到Python中时间模块datetime,将需要的格式进行拼接后,用strftime进行转换。
假设这里我们想把之前简单的1/11月日格式,更改为年月日的样式,中间加上分隔符/或-,就需要用"%x"或"%Y-%m-%d"来进行操作了。注意这里的%加字母都是官方定义好的格式而已,我们用到时候进行拼接,传给函数就可以了。
具体更多的拼接格式如下:
In [199]:
import datetime
In [209]:
d=datetime.datetime(2019,1,11)
In [203]:
d.strftime("%x")
Out[203]:
'01/11/19'
In [205]:
d.strftime("%Y-%m-%d")
Out[205]:
'2019-01-11'
研究完成后,我们编写函数。
首先需要用m, d = cell.value.split('/')把之前简单的日期进行分割,得到m,代表月份和日期,然后用datetime进行转换,生成时间相关的对象day,注意里面的参数是数字,所以用int转换,最后把day进行格式化输出。编写函数后,一定记得测试。
In [218]:
def handle_time(wb, sheetname):
"""
按列循环, 通过参数确认目标
"""
print(f'开始处理工作表:{sheetname}'.center(18, '-'))
sheet = wb[sheetname]
for col in sheet.iter_cols(max_col=1, min_row=2): # 找到时间的列, 第一列,从第二行开始
for cell in col:
print('修改前:', cell.value, end='')
m, d = cell.value.split('/')
day = datetime.datetime(2019, int(m), int(d))
cell.value = day.strftime("%Y-%m-%d")
print('修改后-》》',cell.value)
In [220]:
wb = load_data()
handle_time(wb, '时间')
save_as(wb)
修复数字和符号
4.修复数字和符号
接下来,处理数字和符号相关的操作。加入我们之前的价格,很多是有小数点的,这时候还想保存两位小数,并加上人民币符号为前缀。就需要新的一波研究了。
有小数点,一是要保证位数,我们这里要求2位,二是要对多余的位数四舍五入。可以有以下俩个方式完成,一个用Decimal一个用round,两个的区别是Decimal("0.00")指定位数后,会自动补0,而round遇到0就自动舍掉了。而且round在四舍五入的计算中,还有点特殊。具体可查看官方文档。
我们这里用Decimal来完成函数内相关操作。记得测试啊!
In [227]:
from decimal import Decimal
In [240]:
a = 3.1
b=Decimal(a).quantize(Decimal("0.00"))
print(b)
3.10
In [244]:
round(a,2) # 位数自动省略0
Out[244]:
3.1
In [247]:
def handle_num(wb, sheetname):
"""
按列循环, 通过参数确认目标
"""
print(f'开始处理工作表:{sheetname}'.center(18, '-'))
sheet = wb[sheetname]
for col in sheet.iter_cols(min_col=3, max_col=3, min_row=2): # 找到时间的列, 第一列,从第二行开始
for cell in col:
print('修改前:', cell.value, end='')
# cell.value = round(float(cell.value), 3)
cell.value = '¥' + str(Decimal(cell.value).quantize(Decimal("0.00")))
print('修改后-》》',cell.value)
In [249]:
wb = load_data()
handle_num(wb, '数字符号')
save_as(wb)
到此这篇关于Python 自由定制表格的实现示例的文章就介绍到这了,更多相关Python 自由定制表格内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









