这一期直接来实战。

比如说,我们在一个快递网站上爬取了几个快递的轨迹信息,我们需要将数据保存下来,一个常规做法是把数据保存在数据库里(Mysql,MongoDB,Redis),另一个是用Excel的形式存下来。对于非程序员来说,后者更加普遍,毕竟Excel是世界上使用最广泛的数据分析工具(不吹不黑)。

这次我们用xlwings来实现:

  1. 保存数据
  2. 更新数据

假设我们爬取到了快递信息,并且已经处理成了二维列表的形式以便处理(非本文重点不细说):

1.保存数据

import xlwings as xw
wb = xw.Book()
sht = wb.sheets[0]
info_list = [['20190001','已揽收','凯撒邮局'],
['20190001','已发货','凯撒邮局'],
['20192288','已揽收','麻花镇邮局'],
['20192288','已发货','麻花镇邮局'],
['20192288','正在派送','阿里山']]

  首先,写入表头,

titles = [['包裹号','状态','地点']]
sht.range('a1').value = titles

  然后写入轨迹信息

sht.range('a2').value = info_list

  保存

wb.save('Track.xlsx')

  这样,第一步保存数据就完成了

2.更新数据

我们第二天又爬取了一次信息,发现信息更新了:

[

['20190001','已揽收','凯撒邮局'],

['20190001','已发货','凯撒邮局'],

['20190001','正在派送','王村村口'],

['20190001','已签收','老王家'],

['20192288','已揽收','麻花镇邮局'],

['20192288','已发货','麻花镇邮局'],

['20192288','正在派送','阿里山'],

['20192288','已发货','小马家']

]

更新数据其实没什么难度,直接覆盖写入就好了

但是如果我想知道更新了多少条记录怎么办呢?

将数据去重,剩下的就是更新的

首先读取之前写入的信息:

import xlwings as xw

wb = xw.Book('Track.xlsx')
sht = wb.sheets[0]
first = sht.range('a2').expand('table').value
print(first)

  结果如下

乍一看没什么问题,仔细一看,包裹号都成了浮点数!写入的时候是字符串,读取出来就成了浮点数,所以这时候去重,由于数据类型不一致,无法真正去重。

思路一:直接转化数据类型,将每个列表的第一个元素转为整数,再转为字符串

for i in first:
i[0] = str(round(i[0]))
first_str.append(i)
print(first_str)

  

思路二:如果大家对Excel熟悉的话,就会知道,在数字前面加一个英文字符的单引号('),数字就变成文本格式了,所以我们可以在写入信息的时候加上一个单引号,这样Excel就不会乱改格式了。(以后可能会写一些Excel方面的东西)

import xlwings as xw

wb = xw.Book('Track.xlsx')
sht = wb.sheets[0]
info_list = [["'20190001","已揽收","凯撒邮局"],
["'20190001","已发货","凯撒邮局"],
["'20192288","已揽收","麻花镇邮局"],
["'20192288","已发货","麻花镇邮局"],
["'20192288","正在派送","阿里山"]]
sht.range('a2').value = info_list
values = sht.range('a2').expand('table').value
print(values)

  

然后开始真正的去重

extra = [i for i in second if i not in first_str]
print(extra)
print(len(extra))

  结果没问题,多出三个轨迹信息

为了介绍xlwings的插入功能,我们再来设想这样一种情况:

已经有了两个包裹的轨迹情况

是我们得到了20190001包裹的最新情况,需要更新这一个包裹的信息:

[

["20190001","已揽收","凯撒邮局"],

["20190001","已发货","凯撒邮局"],

["20190001","正在派送","王村村口"],

["20190001","已签收","老王家"]

]

首先,去重

extra = [i for i in second if i not in first_str]
print(extra)

  显示要更新的就一条

读取第一列的包裹号

rng = sht.range('a1').expand('table')
nrows = rng.rows.count
row_a = sht.range(f'a1:a{nrows}').value

  找到要更新的包裹号

for i in extra:
pkg = i[0]
position = row_a.index(pkg)
print(position)
times = row_a.count(pkg)
print(times)

  

position = 1 是指在第二行出现,times = 3 是指一共有3个此包裹号的信息

所以要在第五行插入

rows = position+times+1
sht.range(f'{rows}:{rows}').api.Insert()

  

然后再写入更新的信息

sht.range(f'a{rows}').value = extra

  大功告成!保存

wb.save()

  其实折腾了半天都是为了这个插入语句

sht.range('单元格或行列').api.Insert()

  

#插入列
sht.range('a:a').api.Insert()
#插入行
sht.range('2:2').api.Insert()
#插入单元格
sht.range('b4').api.Insert()

  xlwings就说到这里了

python学习交流群欢迎大家加入一起学习和探讨,也会有干货实战教程分享

Python与Excel交互——Xlwings实战的更多相关文章

  1. Python和Excel交互

    Python和Excel交互 使用的python包为XlsxWriter 下载的链接 https://pypi.python.org/pypi/XlsxWriter 初级的例子: def write_ ...

  2. 震惊!当Python遇到Excel后,将开启你的认知虫洞

    本文主要内容:   1. Excel,你为什么如此强大 2. 软件开发也需要团队作战 3. Excel的集成方案演化 4. macOS特有的集成方案:applescript 5. Python与Exc ...

  3. Python处理Excel和PDF文档

    一.使用Python操作Excel Python来操作Excel文档以及如何利用Python语言的函数和表达式操纵Excel文档中的数据. 虽然微软公司本身提供了一些函数,我们可以使用这些函数操作Ex ...

  4. Python操作Excel

    一.系统性学习 对于操作Excel,需要Xlrd/xlwt这两个模块,下面推荐出系统性学习的网址: python操作Excel读写--使用xlrd 官方文档 Python 使用 Xlrd/xlwt 操 ...

  5. Python处理Excel文件

    因为工作需求,需要审核一部分query内容是否有效,query储存在Excel中,文本内容为页面的Title,而页面的URL以HyperLink的格式关联到每个Cell. 于是本能的想到用Python ...

  6. python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)

    一.上传文件 上传一个图片 使用input type="file",来上传一个文件.注意:form表单必须添加属性enctype="multipart/form-data ...

  7. Python对Excel操作详解

      Python对Excel操作详解 文档摘要: 本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd.xlwt和xlutils模块.另外还演示了如何通过Tcl   ...

  8. 【Python】Python实现Excel用例直接导入testlink-UI界面小工具

    1.写在前面 testlink上传用例一种方法是excel转换为xml,然后再用xml上传,还有一种是调用api进行上传.最开始写了个转换工具,是将excel转换为xml,然后在testlink里上传 ...

  9. python与excel的关系;铁打的python流水的excel

    现在很多行业,都离不开用Excel: 做财务的,要用Excel做报表:做物流的,会用Excel来跟踪订单情况:做HR的,会用Excel算工资:做分析的,会用Excel计算数据做报表.不知道你有没有这样 ...

随机推荐

  1. Django之queryset API

    1. QuerySet 创建对象的方法 >>> from blog.models import Blog >>> b = Blog(name='Beatles Bl ...

  2. Java IO流的写入和写出操作 FileInputStream和FileOutputStream

    今天学习了Java的IO流,关于文件的读入和写出,主要是FileInputStream和FileOutputStream来实现,这两个流是字节流.还有字符流(FileReader和FileWriter ...

  3. 想读Spring源码?先从这篇「 极简教程」开始吧...

    为什么要阅读源码?这是一个有趣的问题,类似的问题还有,为什么要看书?为什么要爬山? 这也是一个哲学问题,我想每个人都有不同的答案,下面我是对阅读源码好处的一些思考. (PS:也欢迎你在评论区留言补充) ...

  4. UnboundLocalError,探讨Python中的绑定

    绑定 将python闭包之前,先梳理一下闭包中的绑定操作. 先看看2个相关的错误 NameError 和UnboundLocalError When a name is not found at al ...

  5. 1035 Password (20分)(水)

    To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...

  6. idea 快捷键 pvsm sout

    1.在IntelJ中和Eclipse中稍有不同,在Eclipse中,输入main再按Alt+/即可自动补全main函数,但是在IntellJ中则是输入psvm,选中即可 2.在方法体内部有for循环, ...

  7. "多行文本"组件:<multi> —— 快应用组件库H-UI

     <import name="multi" src="../Common/ui/h-ui/text/c_text_multi"></impo ...

  8. 在linux中使用mailx发送邮件

    [root@ml ~]# yum -y install mailx   #安装 [root@ml ~]# vim /etc/mail.rc 在最后一行添加(我这里使用的是qq邮箱): @qq.com ...

  9. day01,了解gcc

    今天主要是学一下gcc 功能选项: 一. 1.  gcc -E:表示预处理,把指令处理掉 2.gcc -o:改变目标文件名称 3. gcc -c: 表示只编译不链接(也就是不生成a.out) 4. g ...

  10. 浅谈Vector

    浅谈Vector 在之前的文章中,我们已经说过线程不安全的ArrayList和LinkedList,今天我们来讲讲一个线程安全的列表容器,他就是Vector,他的底层和ArrayList一样使用数组来 ...