进行xlsx 复制一行_利用Phyton对Excel数据进行查错
上周我去了某某中學(xué),正好在辦公室里遇到一個(gè)教務(wù)員(后稱jwy呵呵)正在制作表格,內(nèi)容是關(guān)于學(xué)生加三科目的統(tǒng)計(jì)及安排,內(nèi)容大致如下圖所示:
表格簡(jiǎn)介&項(xiàng)目需求:
表中共有446個(gè)學(xué)生,根據(jù)jwy所說(shuō)ABCDK列不用管,主要看EFGHIJ列,其中等1等2等3意味著等級(jí)考123,合1合2合3意味著合格考123,這些類似于“等1XX”的文本中后兩個(gè)X不用管,jwy說(shuō)項(xiàng)目需求就是檢查在每一行中EFGHIJ六列前兩個(gè)字符有沒(méi)有重復(fù)。Ta覺(jué)得自己做(實(shí))太(在)麻(不)煩(想)了(做)想請(qǐng)我?guī)兔τ胮ython搞。鑒于446行的確多了點(diǎn),我就同意了。
嘿嘿,下面才是正式環(huán)節(jié),請(qǐng)客官看:
錯(cuò)誤版:
合3物3 | 合2化2 | 等3生3 | 合2政2 | 等2歷1 | 等1地4 |
錯(cuò)在合2(有重復(fù))
正確版:
等1物B | 合1化3 | 等3生B | 合3政3 | 合2歷3 | 等2地B |
簡(jiǎn)單地說(shuō),就是每行等123,合123,只能、必須各有一個(gè),否則就有問(wèn)題,jwy需將該行重新調(diào)整。
明確目標(biāo)后,便可以用python代碼來(lái)實(shí)現(xiàn)了。
前期準(zhǔn)備
要用python操作excel,openpyxl庫(kù)是最好的選擇,必須先將其安裝下來(lái),在終端輸入pip install openpyxl即可,前提是安裝了pip。Python編程界面我選用的是簡(jiǎn)單的IDLE(3.8.1版本),讀者也可以用pycharm來(lái)編寫(xiě)程序。為確認(rèn)openpyxl是否安裝成功,可打開(kāi)IDLE,在shell界面輸入import openpyxl,沒(méi)有報(bào)錯(cuò)即可。
我將這個(gè)項(xiàng)目分為四步,其中需要一些python基礎(chǔ),另外我還會(huì)介紹一些項(xiàng)目中要用的openpyxl的函數(shù),其他的可以自行搜索。
第一步:將excel文件打開(kāi)并獲取其操作對(duì)象
核心實(shí)現(xiàn)代碼:
wb=openpyxl.load_workbook(“XX.xlsx”)
作用:打開(kāi)一個(gè)工作簿并獲取其操作對(duì)象
現(xiàn)在就能實(shí)現(xiàn)了!import openpyxlwb=openpyxl.load_workbook("a.xlsx")sheet = wb[‘個(gè)人版’]第一行‘import openpyxl’先把庫(kù)引入進(jìn)來(lái)。第三行是獲取工作簿內(nèi)‘個(gè)人版’這個(gè)工作表的操作對(duì)象。圖為jwy給我的工作簿的結(jié)構(gòu),要進(jìn)行操作的是‘個(gè)人版’這個(gè)工作表。
第二步:獲取EFGHIJ六列中的數(shù)據(jù):
核心實(shí)現(xiàn)代碼:
fori in sheet["E"]:
list_sheet_column_e.append(i.value)
作用:獲取該列中所有的數(shù)據(jù)并存起來(lái)
下面代碼是把EFGHIJ這六列的數(shù)據(jù)分別保存到列表變量中。list_sheet_column_e = []
for i in sheet["E"]:
???list_sheet_column_e.append(i.value)
list_sheet_column_f = []
for i in sheet["F"]:
???list_sheet_column_f.append(i.value)
list_sheet_column_g = []
for i in sheet["G"]:
???list_sheet_column_g.append(i.value)
list_sheet_column_h = []
for i in sheet["H"]:
???list_sheet_column_h.append(i.value)
list_sheet_column_i = []
for i in sheet["I"]:
???list_sheet_column_i.append(i.value)
list_sheet_column_j = []
for i in sheet["J"]:
list_sheet_column_j.append(i.value)
這步很簡(jiǎn)單,復(fù)制就好,不贅述。
第三步:化列為行
核心實(shí)現(xiàn)代碼:無(wú),呵呵,這步技術(shù)含量不高,直接讀每行的值有點(diǎn)麻煩,我就先列后行啦~
現(xiàn)在就能實(shí)現(xiàn)了:row_list = []
for r in range(1,447)*:
row =[list_sheet_column_e[r][0:2],
??? list_sheet_column_f[r][0:2],
??? list_sheet_column_g[r][0:2],
??? list_sheet_column_h[r][0:2],
??? list_sheet_column_i[r][0:2],
??? list_sheet_column_j[r][0:2]]
row_list.append(row)
遍歷六列,將六列中同一行的數(shù)據(jù)橫向存儲(chǔ)在行列表中,再全部保存在一個(gè)大列表中。其中l(wèi)ist_sheet_column_e[r][0:2]的[0:2]是截取前兩個(gè)字符,剔除無(wú)用文本以便后面操作。
注1:range(1,447)是由于第一行的表頭是不需要的。
第四步:檢錯(cuò)并輸出:
核心實(shí)現(xiàn)代碼:
defcheck(a):
??? b = set(a)
??? for each_b in b:
??????? count = 0
??????? for each_a in a:
??????????? if each_b == each_a:
??????????????? count += 1
??????? if count>1:
??????????? return True
作用:這是一個(gè)自定義函數(shù),用于檢測(cè)一個(gè)列表中是否有文本重復(fù),很實(shí)用的函數(shù)哦!
現(xiàn)在就能實(shí)現(xiàn)了:
faults= 0
fori in range(446)*:
??? if check(row_list[i]):
??????? print('fault:')
??????? print((int(i)+2*))
??????? faults+=1
print(‘faults:’+faults)
print(‘done!’)
wb.close()
遍歷每一行,檢查文本是否重復(fù),若有,輸出在原表中錯(cuò)誤的行數(shù),以便糾正,最終再輸出錯(cuò)誤總數(shù),還不能忘記把工作簿關(guān)掉。
注1:range(446)是因?yàn)榍懊嬖诨袨樾袝r(shí)已經(jīng)將第一行剔除了。
注2:+2是因?yàn)榱斜硎菑?開(kāi)始數(shù)的,加一行,另外還原到原表中還有表頭,再加一行。
測(cè)試環(huán)節(jié):
下面是整個(gè)程序的完整代碼(48行):
import openpyxl
def check(a):
??? b = set(a)
??? for each_bin b:
??????? count =0
??????? foreach_a in a:
??????????? ifeach_b == each_a:
???????????????count += 1
??????? ifcount>1:
??????????? return True
wb=openpyxl.load_workbook("a.xlsx")
sheet = wb[“個(gè)人版”]
list_sheet_column_e = []
for i in sheet["E"]:
???list_sheet_column_e.append(i.value)
list_sheet_column_f = []
for i in sheet["F"]:
???list_sheet_column_f.append(i.value)
list_sheet_column_g = []
for i in sheet["G"]:
???list_sheet_column_g.append(i.value)
list_sheet_column_h = []
for i in sheet["H"]:
???list_sheet_column_h.append(i.value)
list_sheet_column_i = []
for i in sheet["I"]:
???list_sheet_column_i.append(i.value)
list_sheet_column_j = []
for i in sheet["J"]:
list_sheet_column_j.append(i.value)
row_list = []
for r in range(1,447):
row =[list_sheet_column_e[r][0:2],
??? list_sheet_column_f[r][0:2],
??? list_sheet_column_g[r][0:2],
??? list_sheet_column_h[r][0:2],
??? list_sheet_column_i[r][0:2],
??? list_sheet_column_j[r][0:2]]
row_list.append(row)
faults = 0
for i in range(446):
??? ifcheck(row_list[i]):
???????print('fault:')
???????print((int(i)+2))
???????faults+=1
print(“faults:”+str(faults))
print(“done!”)
wb.close()
將此段代碼復(fù)制到IDLE里,再把‘a(chǎn).xlsx’放在python文件的同一目錄下運(yùn)行。
421行有錯(cuò),點(diǎn)進(jìn)excel一看,果然:
合2撞了。
????????????? 成功
????????????? 哈哈哈……
后記:
Jwy測(cè)試了兩次,第一次撞了23行,第二次1行,使jwy順利而出色地完成了繁重的任務(wù),鑒于我功高勞苦,我獲得了免費(fèi)的桂圓鋪凍檸茶和雞蛋仔。
學(xué)好python,解嘴饞不難啊,哈哈哈,點(diǎn)個(gè)贊哦!
???????? 完
總結(jié)
以上是生活随笔為你收集整理的进行xlsx 复制一行_利用Phyton对Excel数据进行查错的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: bgp通告四原则_BGP的十三条选路原则
- 下一篇: keil5改工程名称_修改Keil工程名