比如說,我們在一個快遞網站上爬取了幾個快遞的軌跡信息,我們需要將數據保存下來,一個常規做法是把數據保存在數據庫里(Mysql,MongoDB,Redis),另一個是用Excel的形式存下來。對於非程序員來說,后者更加普遍,畢竟Excel是世界上使用最廣泛的數據分析工具(不吹不黑)。
這次我們用xlwings來實現:
-
保存數據
-
更新數據
假設我們爬取到了快遞信息,並且已經處理成了二維列表的形式以便處理(非本文重點不細說):
1.保存數據
import xlwings as xwwb = 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 xwwb = xw.Book('Track.xlsx')sht = wb.sheets[0]first = sht.range('a2').expand('table').valueprint(first)
結果如下

乍一看沒什么問題,仔細一看,包裹號都成了浮點數!寫入的時候是字符串,讀取出來就成了浮點數,所以這時候去重,由於數據類型不一致,無法真正去重。
思路一:直接轉化數據類型,將每個列表的第一個元素轉為整數,再轉為字符串
for i in first: i[0] = str(round(i[0])) first_str.append(i)print(first_str)

思路二:如果大家對Excel熟悉的話,就會知道,在數字前面加一個英文字符的單引號('),數字就變成文本格式了,所以我們可以在寫入信息的時候加上一個單引號,這樣Excel就不會亂改格式了。(以后可能會寫一些Excel方面的東西)
import xlwings as xwwb = xw.Book('Track.xlsx')sht = wb.sheets[0]info_list = [["'20190001","已攬收","凱撒郵局"],["'20190001","已發貨","凱撒郵局"],["'20192288","已攬收","麻花鎮郵局"],["'20192288","已發貨","麻花鎮郵局"],["'20192288","正在派送","阿里山"]]sht.range('a2').value = info_listvalues = 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)
顯示要更新的就一條

讀取第一列的包裹號
rng = sht.range('a1').expand('table')nrows = rng.rows.countrow_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+1sht.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從放棄到真香
鏈接:https://www.jianshu.com/p/18b63172de6e
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。