python编写⼀个4⾏4列的表格_4个⽅法⽤Python⾃由定制
Excel表格
很多开发者说⾃从有了 Python/Pandas,Excel 都不怎么⽤了,⽤它来处理与可视化表格⾮常快速。
下⾯我来举⼏个例⼦。
删除重复⾏和空⾏
我们直接⽤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)
删除空格
删除空格也需要⽤到字符串的函数,所以这⾥还是简单研究⼀下。如果我们想去除字符串中间的空格,可以⽤split默认进⾏分割,然后把分割的结果⽤’’.join⽅法连接起来就可以了。
注意join前是空的字符串。这⾥也⽤不到strip去除两端的空格了,因为split分割后只有⼏个最后的字符
串组成的列表。
In [192]:
a="a b c "
In [194]:
a.strip()
Out[194]:
python怎么读取excel某一列'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, '空格')
修改⽇期和时间格式
有时候,我们需要对表格中时间相关的单元格进⾏格式修改,这⾥需要⽤到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)
修复数字和符号
接下来,处理数字和符号相关的操作。加⼊我们之前的价格,很多是有⼩数点的,这时候还想保存两位⼩数,并加上⼈民币符号为前缀。就需要新的⼀波研究了。
有⼩数点,⼀是要保证位数,我们这⾥要求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:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论