xlwings读取⼀列_Python与Excel——Xlwings实战
正⽂共: 2451字
预计阅读时间: 7分钟
上⼀期讲完了xlwings的基本操作,这⼀期直接来实战。
⽐如说,我们在⼀个快递⽹站上爬取了⼏个快递的轨迹信息,我们需要将数据保存下来,⼀个常规做法是把数据保存在数据库⾥(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').valueprint(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)
显⽰要更新的就⼀条
读取第⼀列的包裹号
python怎么读入excelrng = sht.range('a1').expand('table')
nrows = unt
row_a = sht.range(f'a1:a{nrows}').value
到要更新的包裹号
for i in extra:
pkg = i[0]
position = row_a.index(pkg)
print(position)
times = unt(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就说到这⾥了,讲得还算清楚吗?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论