前言
越来越多开发者示意,自从用了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')]
下面的钻研搞定了,间接把钻研后果放到函数中解决反复行和空行的问题。
留神这时候咱们解决的行数据,所以就不再按列循环了。而且,以后的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 datetimeIn [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 DecimalIn [240]:a = 3.1b=Decimal(a).quantize(Decimal("0.00"))print(b)3.10In [244]:round(a,2) # 位数主动省略0Out[244]:3.1In [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的文章,点点关注不迷路。