这一期直接来实战。

比如说,我们在一个快递网站上爬取了几个快递的轨迹信息,我们需要将数据保存下来,一个常规做法是把数据保存在数据库里(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. NodeMCU入坑指南-低成本打造零舍友闻风丧胆WiFi断网神器

    前言 最近对IoT方面比较感兴趣,所以在某宝上入手了一块NodeMCU的开发板,至于为什么我选择这块开发板呢?嘿嘿,当然是因为便宜啊

  2. web存储cookie会出现两个相同键值问题

    我使用js存储cookie,定义key值是menu,存储过程中出现了相同的menu键值而且有的时候有一个还是null,折腾了三四个小时不知道啥问题: 早上到公司后想着换换键值,就把键值换成了selec ...

  3. Controller与RestController的区别

    在使用Spring系列的框架的时候,相信几乎所有人都会遇见@Controller与@RestController两个注解,那么这两个注解到底有什么区别? 1. 标记有@RestController的类 ...

  4. 在vue项目中使用md5加密 sirai

    1.安装模块 npm install js-md5 -D 2.在项目中引入模块 import md5 from 'js-md5' 3.把你需要加密的信息进行前期处理 CalcuMD5 = functi ...

  5. HTTP Session例子

    HTTP协议是“一次性单向”协议.服务端不能主动连接客户端,只能被动等待并答复客户端请求.客户端连接服务端,发出一个HTTP Request,服务端处理请求,并且返回一个HTTP Response给客 ...

  6. Wireshark的使用(抓包、过滤器)

    Wireshark的使用(抓包.过滤器) 听语音 分步阅读 Wireshark这个转包工具的简单实用 工具/原料 Wireshark软件包 方法/步骤 Wireshark是世界上最流行的网络分析工具. ...

  7. 面试官再问你 HashMap 底层原理,就把这篇文章甩给他看

    前言 HashMap 源码和底层原理在现在面试中是必问的.因此,我们非常有必要搞清楚它的底层实现和思想,才能在面试中对答如流,跟面试官大战三百回合.文章较长,介绍了很多原理性的问题,希望对你有所帮助~ ...

  8. MTK Android SwitchPreference(设置-智能辅助-导航栏-导航栏可隐藏)

    1.界面布局文件 packages/apps/PrizeSettings/res/xml/navigation_bar_prize.xml ------------------------------ ...

  9. python10

     一.多进程multiprocessing multiprocessing包是Python中的多进程管理包.与threading.Thread类似,它可以利用multiprocessing.Proce ...

  10. 七、环回接口ip地址(逻辑接口)

    loopback接口,在网络设备(一般是路由器)上是一种特殊的接口,它不是物理接口,而是一种看不见摸不着的逻辑接口(也称虚拟接口),但是对于网络设备来说却是至关重要的. 在网络设备上可以通过配置命令来 ...