关于python:分手吧Excel-我有Python了

48次阅读

共计 4154 个字符,预计需要花费 11 分钟才能阅读完成。

前言

越来越多开发者示意,自从用了 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 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 的文章,点点关注不迷路。

正文完
 0