分手吧Excel 我有Python了

前言越来越多开发者表示,自从用了Python/Pandas,Excel都没有打开过了,用Python来处理与可视化表格就是四个字——非常快速!
下面我来举几个明显的例子
1.删除重复行和空行我们直接用dict.fromkeys的方法把当前的数据转为字典,默认的值为None因为用不到,也就无所谓了 。然后我们再用list直接对结果进行类型转换,转换为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')]这时候,重复数据直接去掉了,注意我们这里的dict是python3新版本的,所以顺序没有影响,如果你还在用python2或者python3.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')]上面的研究搞定了,直接把研究结果放到函数中解决重复行和空行的问题 。
【分手吧Excel 我有Python了】注意这时候我们处理的行数据,所以就不再按列循环了 。而且,当前的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 = https://www.isolves.com/it/cxkf/yy/Python/2021-12-16/''.join(cell.value.split())print('修改后-》》',cell.value)In [198]:handle_blank(wb, '空格')3.修改日期和时间格式有时候,我们需要对表格中时间相关的单元格进行格式修改,这里需要用到Python中时间模块datetime,将需要的格式进行拼接后,用strftime进行转换 。


推荐阅读