Python 自由定制表格的實(shí)現(xiàn)示例
很多開(kāi)發(fā)者說(shuō)自從有了 Python/Pandas,Excel 都不怎么用了,用它來(lái)處理與可視化表格非常快速。
下面我來(lái)舉幾個(gè)例子。
1. 刪除重復(fù)行和空行
我們直接用dict.fromkeys的方法把當(dāng)前的數(shù)據(jù)轉(zhuǎn)為字典,默認(rèn)的值為None因?yàn)橛貌坏剑簿蜔o(wú)所謂了。然后我們?cè)儆胠ist直接對(duì)結(jié)果進(jìn)行類(lèi)型轉(zhuǎn)換,轉(zhuǎn)換為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’)]
這時(shí)候,重復(fù)數(shù)據(jù)直接去掉了,注意我們這里的dict是python3新版本的,所以順序沒(méi)有影響,如果你還在用python2或者python3.5以下,建議升級(jí)一下python版本。
接下來(lái),就是空數(shù)據(jù)的處理了。觀察(’’,)是個(gè)元組,第一個(gè)位置的數(shù)據(jù)為空字符串,那么整體長(zhǎng)度為1,可以直接通過(guò)循環(huán)來(lái)去掉。這里的循環(huán)我們可以用Python中的語(yǔ)法糖寫(xiě)法,直接一行搞定,最后加個(gè)判斷只留下長(zhǎng)度大于1,最后用list轉(zhuǎn)換為列表。
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’)]
上面的研究搞定了,直接把研究結(jié)果放到函數(shù)中解決重復(fù)行和空行的問(wèn)題。
注意這時(shí)候我們處理的行數(shù)據(jù),所以就不再按列循環(huán)了。而且,當(dāng)前的sheet中處理之后,每一行的內(nèi)容都會(huì)修改位置或刪除。所以我們先用old_rows = [x for x in sheet.values]取到舊的每一行的數(shù)據(jù),注意這里的sheet后直接用values取到數(shù)據(jù),而不是cell對(duì)象。這里的old_rows是個(gè)列表,就可以用剛才的研究直接轉(zhuǎn)為刪除重復(fù)和空行的數(shù)據(jù)了。
接下來(lái),用sheet.delete_rows(1, sheet.max_row)
刪除所有行,第一個(gè)參數(shù)表示從第一行開(kāi)始,第二個(gè)參數(shù)為最大行數(shù)。最后,用循環(huán)新的行數(shù)據(jù)的方式,把新數(shù)據(jù)寫(xiě)入當(dāng)前的sheet。
In [189]:def handle_duplicate(wb, sheetname): ''' 去除重復(fù)行,空行 先取出每一行,清空sheet,處理后寫(xiě)回 ''' print(f’開(kāi)始處理工作表:{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) # 寫(xiě)入新數(shù)據(jù) for row in new_rows: sheet.append(row)
運(yùn)行測(cè)試,查看結(jié)果。再說(shuō)一次,一定記得測(cè)試啊!如果有錯(cuò)誤就根據(jù)錯(cuò)誤提示,查看代碼,反復(fù)調(diào)試,去除bugs。
In [190]:wb = load_data()handle_duplicate(wb, ’重復(fù)行’)save_as(wb)
2.刪除空格
刪除空格也需要用到字符串的函數(shù),所以這里還是簡(jiǎn)單研究一下。如果我們想去除字符串中間的空格,可以用split默認(rèn)進(jìn)行分割,然后把分割的結(jié)果用’’.join方法連接起來(lái)就可以了。注意join前是空的字符串。這里也用不到strip去除兩端的空格了,因?yàn)閟plit分割后只有幾個(gè)最后的字符串組成的列表。
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 [ ]:
研究成功后,寫(xiě)入函數(shù)。這次命名為handle_blank。
In [197]:def handle_blank(wb, sheetname): ''' 按列循環(huán), 通過(guò)參數(shù)確認(rèn)目標(biāo) ''' print(f’開(kāi)始處理工作表:{sheetname}’.center(18, ’-’)) sheet = wb[sheetname] for col in sheet.iter_cols(): # 不加參數(shù),循環(huán)所有列 for cell in col: print(’修改前:’, cell.value, end=’’) cell.value = ’’.join(cell.value.split()) print(’修改后-》》’,cell.value)In [198]:handle_blank(wb, ’空格’)
3.修改日期和時(shí)間格式
有時(shí)候,我們需要對(duì)表格中時(shí)間相關(guān)的單元格進(jìn)行格式修改,這里需要用到Python中時(shí)間模塊datetime,將需要的格式進(jìn)行拼接后,用strftime進(jìn)行轉(zhuǎn)換。
假設(shè)這里我們想把之前簡(jiǎn)單的1/11月日格式,更改為年月日的樣式,中間加上分隔符/或-,就需要用'%x'或'%Y-%m-%d'來(lái)進(jìn)行操作了。注意這里的%加字母都是官方定義好的格式而已,我們用到時(shí)候進(jìn)行拼接,傳給函數(shù)就可以了。
具體更多的拼接格式如下:
In [199]:import datetimeIn [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’
研究完成后,我們編寫(xiě)函數(shù)。
首先需要用m, d = cell.value.split(’/’)把之前簡(jiǎn)單的日期進(jìn)行分割,得到m,代表月份和日期,然后用datetime進(jìn)行轉(zhuǎn)換,生成時(shí)間相關(guān)的對(duì)象day,注意里面的參數(shù)是數(shù)字,所以用int轉(zhuǎn)換,最后把day進(jìn)行格式化輸出。編寫(xiě)函數(shù)后,一定記得測(cè)試。
In [218]:def handle_time(wb, sheetname): ''' 按列循環(huán), 通過(guò)參數(shù)確認(rèn)目標(biāo) ''' print(f’開(kāi)始處理工作表:{sheetname}’.center(18, ’-’)) sheet = wb[sheetname] for col in sheet.iter_cols(max_col=1, min_row=2): # 找到時(shí)間的列, 第一列,從第二行開(kāi)始 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, ’時(shí)間’)save_as(wb)
4.修復(fù)數(shù)字和符號(hào)
接下來(lái),處理數(shù)字和符號(hào)相關(guān)的操作。加入我們之前的價(jià)格,很多是有小數(shù)點(diǎn)的,這時(shí)候還想保存兩位小數(shù),并加上人民幣符號(hào)為前綴。就需要新的一波研究了。
有小數(shù)點(diǎn),一是要保證位數(shù),我們這里要求2位,二是要對(duì)多余的位數(shù)四舍五入。可以有以下倆個(gè)方式完成,一個(gè)用Decimal一個(gè)用round,兩個(gè)的區(qū)別是Decimal('0.00')指定位數(shù)后,會(huì)自動(dòng)補(bǔ)0,而round遇到0就自動(dòng)舍掉了。而且round在四舍五入的計(jì)算中,還有點(diǎn)特殊。具體可查看官方文檔。
我們這里用Decimal來(lái)完成函數(shù)內(nèi)相關(guān)操作。記得測(cè)試啊!
In [227]:from decimal import DecimalIn [240]:a = 3.1b=Decimal(a).quantize(Decimal('0.00'))print(b)3.10In [244]:round(a,2) # 位數(shù)自動(dòng)省略0Out[244]:3.1In [247]:def handle_num(wb, sheetname): ''' 按列循環(huán), 通過(guò)參數(shù)確認(rèn)目標(biāo) ''' print(f’開(kāi)始處理工作表:{sheetname}’.center(18, ’-’)) sheet = wb[sheetname] for col in sheet.iter_cols(min_col=3, max_col=3, min_row=2): # 找到時(shí)間的列, 第一列,從第二行開(kāi)始 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, ’數(shù)字符號(hào)’)save_as(wb)
到此這篇關(guān)于Python 自由定制表格的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Python 自由定制表格內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. .Net Core和RabbitMQ限制循環(huán)消費(fèi)的方法2. jsp文件下載功能實(shí)現(xiàn)代碼3. ASP動(dòng)態(tài)網(wǎng)頁(yè)制作技術(shù)經(jīng)驗(yàn)分享4. JSP之表單提交get和post的區(qū)別詳解及實(shí)例5. Xml簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理6. vue3+ts+elementPLus實(shí)現(xiàn)v-preview指令7. phpstudy apache開(kāi)啟ssi使用詳解8. jsp實(shí)現(xiàn)登錄驗(yàn)證的過(guò)濾器9. 詳解瀏覽器的緩存機(jī)制10. 如何在jsp界面中插入圖片
