Python 自由定制表格的實現(xiàn)示例
很多開發(fā)者說自從有了 Python/Pandas,Excel 都不怎么用了,用它來處理與可視化表格非??焖?。
下面我來舉幾個例子。
1. 刪除重復(fù)行和空行
我們直接用dict.fromkeys的方法把當(dāng)前的數(shù)據(jù)轉(zhuǎn)為字典,默認(rèn)的值為None因為用不到,也就無所謂了。然后我們再用list直接對結(jié)果進(jìn)行類型轉(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')]
這時候,重復(fù)數(shù)據(jù)直接去掉了,注意我們這里的dict是python3新版本的,所以順序沒有影響,如果你還在用python2或者python3.5以下,建議升級一下python版本。
接下來,就是空數(shù)據(jù)的處理了。觀察('',)是個元組,第一個位置的數(shù)據(jù)為空字符串,那么整體長度為1,可以直接通過循環(huán)來去掉。這里的循環(huán)我們可以用Python中的語法糖寫法,直接一行搞定,最后加個判斷只留下長度大于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ù)行和空行的問題。
注意這時候我們處理的行數(shù)據(jù),所以就不再按列循環(huán)了。而且,當(dāng)前的sheet中處理之后,每一行的內(nèi)容都會修改位置或刪除。所以我們先用old_rows = [x for x in sheet.values]取到舊的每一行的數(shù)據(jù),注意這里的sheet后直接用values取到數(shù)據(jù),而不是cell對象。這里的old_rows是個列表,就可以用剛才的研究直接轉(zhuǎn)為刪除重復(fù)和空行的數(shù)據(jù)了。
接下來,用sheet.delete_rows(1, sheet.max_row)
刪除所有行,第一個參數(shù)表示從第一行開始,第二個參數(shù)為最大行數(shù)。最后,用循環(huán)新的行數(shù)據(jù)的方式,把新數(shù)據(jù)寫入當(dāng)前的sheet。
In [189]: def handle_duplicate(wb, sheetname): """ 去除重復(fù)行,空行 先取出每一行,清空sheet,處理后寫回 """ print(f'開始處理工作表:{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) # 寫入新數(shù)據(jù) for row in new_rows: sheet.append(row)
運(yùn)行測試,查看結(jié)果。再說一次,一定記得測試??!如果有錯誤就根據(jù)錯誤提示,查看代碼,反復(fù)調(diào)試,去除bugs。
In [190]: wb = load_data() handle_duplicate(wb, '重復(fù)行') save_as(wb)
2.刪除空格
刪除空格也需要用到字符串的函數(shù),所以這里還是簡單研究一下。如果我們想去除字符串中間的空格,可以用split默認(rèn)進(jìn)行分割,然后把分割的結(jié)果用''.join方法連接起來就可以了。注意join前是空的字符串。這里也用不到strip去除兩端的空格了,因為split分割后只有幾個最后的字符串組成的列表。
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 [ ]:
研究成功后,寫入函數(shù)。這次命名為handle_blank。
In [197]: def handle_blank(wb, sheetname): """ 按列循環(huán), 通過參數(shù)確認(rèn)目標(biāo) """ print(f'開始處理工作表:{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.修改日期和時間格式
有時候,我們需要對表格中時間相關(guān)的單元格進(jìn)行格式修改,這里需要用到Python中時間模塊datetime,將需要的格式進(jìn)行拼接后,用strftime進(jìn)行轉(zhuǎn)換。
假設(shè)這里我們想把之前簡單的1/11月日格式,更改為年月日的樣式,中間加上分隔符/或-,就需要用"%x"或"%Y-%m-%d"來進(jìn)行操作了。注意這里的%加字母都是官方定義好的格式而已,我們用到時候進(jìn)行拼接,傳給函數(shù)就可以了。
具體更多的拼接格式如下:
In [199]: import datetime In [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'
研究完成后,我們編寫函數(shù)。
首先需要用m, d = cell.value.split('/')把之前簡單的日期進(jìn)行分割,得到m,代表月份和日期,然后用datetime進(jìn)行轉(zhuǎn)換,生成時間相關(guān)的對象day,注意里面的參數(shù)是數(shù)字,所以用int轉(zhuǎn)換,最后把day進(jìn)行格式化輸出。編寫函數(shù)后,一定記得測試。
In [218]: def handle_time(wb, sheetname): """ 按列循環(huán), 通過參數(shù)確認(rèn)目標(biāo) """ print(f'開始處理工作表:{sheetname}'.center(18, '-')) sheet = wb[sheetname] for col in sheet.iter_cols(max_col=1, min_row=2): # 找到時間的列, 第一列,從第二行開始 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, '時間') save_as(wb)
4.修復(fù)數(shù)字和符號
接下來,處理數(shù)字和符號相關(guān)的操作。加入我們之前的價格,很多是有小數(shù)點(diǎn)的,這時候還想保存兩位小數(shù),并加上人民幣符號為前綴。就需要新的一波研究了。
有小數(shù)點(diǎn),一是要保證位數(shù),我們這里要求2位,二是要對多余的位數(shù)四舍五入??梢杂幸韵聜z個方式完成,一個用Decimal一個用round,兩個的區(qū)別是Decimal("0.00")指定位數(shù)后,會自動補(bǔ)0,而round遇到0就自動舍掉了。而且round在四舍五入的計算中,還有點(diǎn)特殊。具體可查看官方文檔。
我們這里用Decimal來完成函數(shù)內(nèi)相關(guān)操作。記得測試??!
In [227]: from decimal import Decimal In [240]: a = 3.1 b=Decimal(a).quantize(Decimal("0.00")) print(b) 3.10 In [244]: round(a,2) # 位數(shù)自動省略0 Out[244]: 3.1 In [247]: def handle_num(wb, sheetname): """ 按列循環(huán), 通過參數(shù)確認(rèn)目標(biāo) """ print(f'開始處理工作表:{sheetname}'.center(18, '-')) sheet = wb[sheetname] for col in sheet.iter_cols(min_col=3, max_col=3, min_row=2): # 找到時間的列, 第一列,從第二行開始 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ù)字符號') save_as(wb)
到此這篇關(guān)于Python 自由定制表格的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Python 自由定制表格內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python中使用xlrd、xlwt操作excel表格詳解
- Python實現(xiàn)批量讀取word中表格信息的方法
- python實現(xiàn)數(shù)據(jù)寫入excel表格
- python爬蟲爬取網(wǎng)頁表格數(shù)據(jù)
- Python實現(xiàn)簡單HTML表格解析的方法
- Python實現(xiàn)將數(shù)據(jù)庫一鍵導(dǎo)出為Excel表格的實例
- Python將多個excel表格合并為一個表格
- python讀取Excel表格文件的方法
- 使用python批量讀取word文檔并整理關(guān)鍵信息到excel表格的實例
- python Pandas 讀取txt表格的實例
相關(guān)文章
python 表達(dá)式和語句及for、while循環(huán)練習(xí)實例
下面小編就為大家?guī)硪黄猵ython 表達(dá)式和語句及for、while循環(huán)練習(xí)實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07OpenCV MediaPipe實現(xiàn)顏值打分功能
這篇文章主要介紹了通過OpenCV MediaPipe實現(xiàn)攝像頭實時檢測顏值打分功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定的幫助,感興趣的可以了解一下2021-12-12python接口自動化測試數(shù)據(jù)和代碼分離解析
代碼的可維護(hù)性除了代碼冗余之外還有就是數(shù)據(jù)盡量不要和代碼摻雜在一起,因為閱讀起來會非常的凌亂;數(shù)據(jù)分離能更好的增加代碼可讀性和可維護(hù)性,也能更好的二次修改使用2021-09-09python中tf.boolean_mask()函數(shù)的使用方法詳解
這篇文章主要介紹了python中tf.boolean_mask()函數(shù)的使用方法詳解,?tf.boolean_mask()?函數(shù)的作用是通過布爾值對指定的列的元素進(jìn)行過濾,需要的朋友可以參考下2023-11-11python?pandas數(shù)據(jù)處理之刪除特定行與列
Pandas是數(shù)據(jù)科學(xué)中的利器,你可能想到的數(shù)據(jù)處理騷操作,貌似用Pandas都能夠?qū)崿F(xiàn),下面這篇文章主要給大家介紹了關(guān)于python?pandas數(shù)據(jù)處理之刪除特定行與列的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08Python結(jié)合OpenCV和Pyzbar實現(xiàn)實時攝像頭識別二維碼
這篇文章主要為大家詳細(xì)介紹了如何使用Python編程語言結(jié)合OpenCV和Pyzbar庫來實時攝像頭識別二維碼,文中的示例代碼講解詳細(xì),需要的可以參考下2024-01-01Python實現(xiàn)解析路徑字符串并獲取每個文件夾名稱
在?Python?中,解析路徑字符串并獲取每個文件夾的名稱是一項常見的任務(wù),這篇文章主要為大家詳細(xì)介紹了Python解析路徑字符串的具體方法,希望對大家有所幫助2024-04-04Django 多表關(guān)聯(lián) 存儲 使用方法詳解 ManyToManyField save
今天小編就為大家分享一篇Django 多表關(guān)聯(lián) 存儲 使用方法詳解 ManyToManyField save,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08