当前位置: 首页 > 后端技术 > Python

用Python自由定制Excel表格的4种方法

时间:2023-03-26 16:57:11 Python

很多开发者表示,自从有了Python/Pandas,Excel就用得不多了,处理和可视化表格的速度非常快。让我举几个例子。删除重复行和空行,我们直接使用dict.fromkeys方法将当前数据转换成字典。默认值为None,因为没有用到,所以无所谓。然后我们使用列表直接将结果转换为列表。In[135]:forrowinrows4:print(row)('name','address')('tomli','beijing')('tomli','beijing')('',)('marywang','山东')('marywang','山东')('',)('de8ug','广州')In[148]:dict.fromkeys(rows4)Out[148]:{('姓名','地址'):None,('tomli','北京'):None,('',):None,('marywang','山东'):None,('de8ug','广州'):None}In[137]:list(dict.fromkeys(rows4))Out[137]:[('name','address'),('tomli','beijing'),('',),('marywang','山东'),('de8ug','广州')]此时直接去掉重复数据。注意这里的dict是python3的新版本,所以顺序没有影响。如果你还在使用python2或者python3.5以下,建议升级python版本。接下来是空数据的处理。observation('',)是一个元组,第一个位置的数据是空串,所以整体长度为1,直接循环去掉即可。这里的循环,我们可以利用Python中的语法糖,直接一行写,最后加上判断只留下大于1的长度,最后用list转成list。In[179]:list(xforxindict.fromkeys(rows4)iflen(x[0])>1)Out[179]:[('name','address'),('tomli','beijing'),('marywang','shandong'),('de8ug','guangzhou')]以上研究完成,将研究成果直接放入函数中,解决重复行问题和空白行。注意此时我们处理的是行数据,所以不再按列循环。而且,在当前工作表中处理后,每一行的内容都会被修改或删除。所以我们首先使用old_rows=[xforxinsheet.values]来获取每个旧行的数据。注意这里sheet之后,直接使用values获取数据,而不是cell对象。这里的old_rows是一个列表,可以利用刚才的研究,直接删除重复行和空白行的数据。接下来,使用sheet.delete_rows(1,sheet.max_row)删除所有行。第一个参数表示从第一行开始,第二个参数是最大行数。最后,通过循环遍历新行数据,将新数据写入当前工作表。in[189]:defhandle_duplicate(wb,sheetname):"""去除重复行,先取出每个空行,清空sheet,处理完后写回"""print(f'开始处理工作表:{sheetname}'.center(18,'-'))sheet=wb[sheetname]old_rows=[xforxinsheet.values]print('beforemodification:',old_rows)new_rows=list(xforxindict.fromkeys(old_rows)iflen(x[0])>1)print('modified-》',new_rows)#删除所有行sheet.delete_rows(1,sheet.max_row)#为new_rows中的行写入新数据:sheet.append(行)运行测试并查看结果。再次强调,一定要测试!如果有错误,根据错误信息检查代码,反复调试,排除bug。在[190]:wb=load_data()handle_duplicate(wb,'duplicaterow')save_as(wb)删除空格和删除空格也需要用到字符串函数,这里简单学习一下。如果我们要去除字符串中间的空格,可以默认使用split进行拆分,然后使用''.join方法连接拆分结果。注意加入前的空字符串。不需要用strip去掉两端的空格,因为split之后,list中final的字符串就那么几个了。In[192]:a="abc"In[194]:a.strip()Out[194]:'abc'In[195]:a.split()Out[195]:['a','b','c']In[196]:''.join(a.split())Out[196]:'abc'In[]:研究成功后,编写函数。这次将其命名为handle_blank。In[197]:defhandle_blank(wb,sheetname):"""按列循环,通过参数确认目标"""print(f'开始处理工作表:{sheetname}'.center(18,'-'))sheet=wb[sheetname]forcolinsheet.iter_cols():#不带参数,循环所有列forcellincol:print('beforemodification:',cell.value,end='')cell.value=''.join(cell.value.split())print('Modified-"》',cell.value)In[198]:handle_blank(wb,'space')修改日期时间格式有时候,我们需要修改格式表格中与时间相关的单元格,这里需要用到Python中的时间模块datetime,拼接出需要的格式后,使用strftime进行转换。假设我们要把之前简单的1/11月-日格式改成年-月-日的样式,中间有一个分隔符/或者-,我们需要使用“%x”或者“%Y-%m”-%d"来操作。请注意,这里的%加字母只是官方定义的格式。我们在使用的时候,拼接起来传给函数即可。更具体的拼接格式如下:In[199]:importdatetimeIn[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]:defhandle_time(wb,sheetname):"""按列循环,通过参数确认目标"""print(f'开始处理worksheet:{sheetname}'.center(18,'-'))sheet=wb[sheetname]forcolinsheet.iter_cols(max_col=1,min_row=2):#查找时间的列,第一列,从第二行开始forcellincol: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('Modified-"》',cell.value)In[220]:wb=load_data()handle_time(wb,'time')save_as(wb)修复数字和符号接下来处理数字和符号相关的操作,加入我们之前很多价格都有小数点,这时候想保留两位小数,加上人民币符号作为前缀,需要新一波的研究。有是小数点,一是保证位数,我们这里要求2位,二是把多余的数字四舍五入。可以在以下两种方式,一种使用Decimal,另一种使用round。两者的区别是Decimal("0.00")指定位数后会自动补0,而round遇到0会自动丢掉。而且round在四舍五入的计算上有点特殊。有关详细信息,请参阅官方文档。这里我们使用Decimal来完成函数内部的相关操作。记得测试!In[227]:fromdecimalimportDecimalIn[240]:a=3.1b=Decimal(a).quantize(Decimal("0.00"))print(b)3.10In[244]:round(a,2)#bits编号自动省略。0Out[244]:3.1In[247]:defhandle_num(wb,sheetname):"""按列循环,通过参数确认目标"""print(f'开始处理工作表:{sheetname}'.center(18,'-'))sheet=wb[sheetname]forcolinsheet.iter_cols(min_col=3,max_col=3,min_row=2):#查找时间的列,第一列,从第二行开始forcellincol: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)

最新推荐
猜你喜欢