用Python實(shí)現(xiàn)等級(jí)劃分
我們要開始學(xué)習(xí)如何做等級(jí)劃分啦。要實(shí)現(xiàn)這一功能,還得學(xué)習(xí) 5 個(gè)新的知識(shí)點(diǎn),分別是os.path.exists()
、os.mkdir()
、算術(shù)運(yùn)算符 //
、%
和cn2an.an2cn()
在這一個(gè)功能中,我們需要將【銷售總表.xlsx】按照銷售排名拆分成【等級(jí)x銷售表.xlsx】,并放置在【等級(jí)銷售表】文件夾中,其中以120人為一個(gè)等級(jí)。
根據(jù)項(xiàng)目概述中對(duì)等級(jí)劃分
功能的描述,可以總結(jié)成以下 3 個(gè)小步驟,他們分別是:
1)新建一個(gè)【等級(jí)銷售表】文件夾,用于存放生成的【等級(jí)x銷售表.xlsx】;
2)將【銷售總表.xlsx】按照“銷售排名”列進(jìn)行拆分,每 120 人為一個(gè)等級(jí),確定等級(jí)數(shù)量;
3)根據(jù)等級(jí)數(shù)量新建相應(yīng)數(shù)量的工作簿,從等級(jí)一開始往后排,寫入各個(gè)等級(jí)的人員銷售與排名數(shù)據(jù),并保存為【等級(jí)x銷售表.xlsx】,x 為對(duì)應(yīng)的等級(jí)。
等級(jí)劃分
新建等級(jí)銷售表文件夾
劃分等級(jí)之后,不可避免地會(huì)出現(xiàn)多個(gè)新的工作簿,如果仍和【銷售總表.xlsx】以及【銷售數(shù)據(jù)】文件夾存放在同一目錄下,會(huì)導(dǎo)致查找文件不便。
為了更好地歸納文件,在拆分之前可以先建立一個(gè)文件夾用于存放新的工作簿,這里就需要用到os.path.exists()
和os.mkdir()
這兩個(gè)新知識(shí)點(diǎn)。
exists 是“存在”的意思,os.path.exists() 顧名思義是用于判斷路徑是否存在,括號(hào)內(nèi)寫的是文件/文件夾的路徑,若路徑存在,返回 True,若不存在,則返回 False。
import os # 當(dāng)前目錄下存在test文件夾 print(os.path.exists('./test/')) # 當(dāng)前目錄下不存在test_new文件夾 print(os.path.exists('./test_new/'))
因?yàn)椤総est】文件夾存在,所以會(huì)打印 True,而【test_new】文件夾不存在,會(huì)打印False。
這個(gè)時(shí)候如果想要新建一個(gè)文件夾,就得用到os.mkdir()
。
dir 是“目錄/路徑”的意思,故 os.mkdir() 是用于創(chuàng)建目錄/路徑,os.path.exists()
和os.mkdir()
這兩個(gè)知識(shí)點(diǎn)經(jīng)常結(jié)合著使用。
仍然以上面的情景為例,如果【test_new】文件夾不存在,則新建【test_new】文件夾,代碼可以這么寫:
import os # 判斷是否存在文件夾 path = './test_new/' if not os.path.exists(path): # 新建文件夾 os.mkdir(path)
我們可以看到【static3】文件夾中多了一個(gè)【test_new】文件夾。
回到項(xiàng)目本身,如果我們要?jiǎng)?chuàng)建“等級(jí)銷售表”文件夾,代碼應(yīng)該怎么寫呢?
import os path = './等級(jí)銷售表/' # 判斷是否存在文件夾'./等級(jí)銷售表/',若不存在,則新建'./等級(jí)銷售表/' if not os.path.exists(path): os.mkdir(path)
確定等級(jí)數(shù)量
根據(jù)康明的需求,每 120 人會(huì)劃分為一個(gè)等級(jí)。所以第一步我們要先確定總?cè)藬?shù)有多少,換個(gè)角度思考,其實(shí)就是要知道我們前面一直在用的列表 total_rows 有多長(zhǎng)。
關(guān)于列表的長(zhǎng)度,我們可以用len(list)
求得。
確定了總?cè)藬?shù),接下來(lái)還需要結(jié)合運(yùn)算的結(jié)果確定具體需要拆分成幾個(gè)等級(jí),因此在運(yùn)算的時(shí)候需要用到算術(shù)運(yùn)算符 //
和 %
。
//
用于返回除除法式子的商,可以理解為取整除。
%
則用于返回除法式子的余數(shù),即取模
來(lái)串代碼看看
print('商:', 10 // 3) print('余數(shù):', 10 % 3)
10 除以 3,得到的商是 3,余數(shù)是 1,剛好與代碼結(jié)果相符。
下面我們?nèi)?total_rows 中的前 10 項(xiàng)數(shù)據(jù)為例進(jìn)行拆分,每 4 項(xiàng)分為一個(gè)等級(jí),
cut = 4 # 取出在匯總排序功能中最后得到的total_rows的一小部分?jǐn)?shù)據(jù) total_rows = [['陳潔', '銷售七組', 10393, 815, 2993, 971, 1833, 889, 1128, 8629, 1], ['劉波', '銷售七組', 10133, 1496, 2667, 774, 1924, 315, 1142, 8318, 2], ['陳濤', '銷售六組', 10140, 1481, 2267, 568, 1989, 1236, 741, 8282, 3], ['張華', '銷售二組', 10212, 1395, 2908, 490, 1485, 1149, 837, 8264, 4], ['陳偉', '銷售八組', 10427, 1289, 2828, 502, 1279, 1354, 972, 8224, 5], ['李冬梅', '銷售六組', 10195, 326, 2946, 886, 1963, 1309, 657, 8087, 6], ['楊秀蘭', '銷售五組', 10371, 509, 2715, 992, 1394, 1301, 1174, 8085, 7], ['楊林', '銷售四組', 10063, 862, 2766, 799, 1611, 964, 1077, 8079, 8], ['李波', '銷售一組', 10044, 1380, 2995, 886, 946, 1468, 327, 8002, 9], ['李雪梅', '銷售二組', 10078, 1099, 2448, 760, 1574, 1215, 889, 7985, 10]] # 計(jì)算等級(jí)數(shù)量,先整除,得到至少需要拆分的等級(jí)數(shù)量nums nums = len(total_rows) // cut # 如果余數(shù)不為0,則等級(jí)數(shù)量nums+1,得到最終需要的等級(jí)數(shù)量 if len(total_rows) % cut != 0: nums += 1 print(nums)
在上面的代碼中,第 8 行是先整除計(jì)算出等級(jí)數(shù)量,第 11 到13 行,則是用于判斷計(jì)算數(shù)量等級(jí)的時(shí)候是否能整除,即余數(shù)是否為 0 。如果余數(shù)不為 0 ,則等級(jí)數(shù)量加 1 ,即可得到最終需要的數(shù)量等級(jí)。
拆分?jǐn)?shù)據(jù)并保存工作簿
明確了等級(jí)數(shù)量,下面開始新建工作簿,寫入表頭信息,遍歷 total_rows 列表,但有一個(gè)新的問題,如何實(shí)現(xiàn)每 120 人就拆分成一個(gè)等級(jí)呢?
其實(shí)不難,就是做切片,
# 拆分為3個(gè)等級(jí) nums = 3 # 每4項(xiàng)為一個(gè)等級(jí) cut = 4 # 定義列表 list_info = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 通過遍歷拆分成了3個(gè)列表 for i in range(nums): # 限定了每個(gè)列表最多有cut項(xiàng) print(list_info[i*cut:(i+1)*cut])
這里第 10 行之所以乘以 cut,是因?yàn)槲覀兿胍悦?4 項(xiàng)切分為一個(gè)等級(jí),保證了每一次切片得到的列表最多是 4 項(xiàng),list_info[i * cut: (i + 1) * cut]
分別取到了list_info[0:4]
,list_info[4:8]
,list_info[8:12]
,因?yàn)?list_info 只有 10 項(xiàng),最多到list_info[9]
,因此list_info[8:12]
實(shí)際上就只是取到 list_info 列表的最后兩項(xiàng),得到最后一個(gè)等級(jí)列表。
回到項(xiàng)目中,我們做一個(gè)練習(xí),依舊取前面用的 total_rows 列表的前 10 項(xiàng),每 4 項(xiàng)拆分為一個(gè)等級(jí)并寫進(jìn)新工作表,
from openpyxl import Workbook # 每4項(xiàng)拆分為一個(gè)等級(jí) cut = 4 # 總共拆成3個(gè)等級(jí) nums = 3 # 取出在匯總排序功能中最后得到的total_rows的一小部分?jǐn)?shù)據(jù) total_rows = [['陳潔', '銷售七組', 10393, 815, 2993, 971, 1833, 889, 1128, 8629, 1], ['劉波', '銷售七組', 10133, 1496, 2667, 774, 1924, 315, 1142, 8318, 2], ['陳濤', '銷售六組', 10140, 1481, 2267, 568, 1989, 1236, 741, 8282, 3], ['張華', '銷售二組', 10212, 1395, 2908, 490, 1485, 1149, 837, 8264, 4], ['陳偉', '銷售八組', 10427, 1289, 2828, 502, 1279, 1354, 972, 8224, 5], ['李冬梅', '銷售六組', 10195, 326, 2946, 886, 1963, 1309, 657, 8087, 6], ['楊秀蘭', '銷售五組', 10371, 509, 2715, 992, 1394, 1301, 1174, 8085, 7], ['楊林', '銷售四組', 10063, 862, 2766, 799, 1611, 964, 1077, 8079, 8], ['李波', '銷售一組', 10044, 1380, 2995, 886, 946, 1468, 327, 8002, 9], ['李雪梅', '銷售二組', 10078, 1099, 2448, 760, 1574, 1215, 889, 7985, 10]] # 按等級(jí)數(shù)量,拆分等級(jí)表 for num in range(nums): # 新建工作表 new_wb = Workbook() new_sheet = new_wb.active # 寫入表頭 new_sheet.append(['姓名', '銷售小組', '工號(hào)', '牛奶/瓶', '礦泉水/瓶', '果蔬汁/瓶', '汽水/瓶', '茶飲料/瓶', '咖啡/瓶', '總計(jì)/瓶', '銷售排名']) # 寫入數(shù)據(jù) for row in total_rows[num*cut:(num+1)*cut]: new_sheet.append(row) # 保存等級(jí)表 new_wb.save('等級(jí){}銷售表.xlsx'.format(num + 1))
因?yàn)槲覀兠看味继崛〕鰜?lái) 4 個(gè)人的銷售數(shù)據(jù),每個(gè)人的銷售數(shù)據(jù)是一個(gè)單獨(dú)的列表,所以按上面示例第 21 行代碼切片得到的實(shí)際結(jié)果如下所示:
[['陳潔', '銷售七組', 10393, 815, 2993, 971, 1833, 889, 1128, 8629, 1], ['劉波', '銷售七組', 10133, 1496, 2667, 774, 1924, 315, 1142, 8318, 2], ['陳濤', '銷售六組', 10140, 1481, 2267, 568, 1989, 1236, 741, 8282, 3], ['張華', '銷售二組', 10212, 1395, 2908, 490, 1485, 1149, 837, 8264, 4]]
[['陳偉', '銷售八組', 10427, 1289, 2828, 502, 1279, 1354, 972, 8224, 5], ['李冬梅', '銷售六組', 10195, 326, 2946, 886, 1963, 1309, 657, 8087, 6], ['楊秀蘭', '銷售五組', 10371, 509, 2715, 992, 1394, 1301, 1174, 8085, 7], ['楊林', '銷售四組', 10063, 862, 2766, 799, 1611, 964, 1077, 8079, 8]]
[['李波', '銷售一組', 10044, 1380, 2995, 886, 946, 1468, 327, 8002, 9], ['李雪梅', '銷售二組', 10078, 1099, 2448, 760, 1574, 1215, 889, 7985, 10]]
嵌套的列表并不適合寫進(jìn)新工作表,第 20-22 行增加遍歷是為了獲取到每個(gè)人單獨(dú)的銷售數(shù)據(jù)也就是單獨(dú)的小列表,然后再寫進(jìn)新工作表。
最后用 num+1 是因?yàn)槲覀円獜牡燃?jí)1開始往后排,而不是從等級(jí) 0 開始。
重新看一下,康明在保存為【等級(jí)x銷售表.xlsx】的時(shí)候,x 用的是中文數(shù)字,而不是我們項(xiàng)目中的阿拉伯?dāng)?shù)字。因此引出我們要學(xué)習(xí)的一個(gè)最后一個(gè)新知識(shí)點(diǎn)——cn2an.an2cn()
,這個(gè)用法是很容易的。
在電腦本地運(yùn)行的時(shí)候需要提前安裝 cn2an 模塊。我們使用pip在cmd/終端中進(jìn)行安裝。
# Windows系統(tǒng): pip install cn2an # Mac系統(tǒng): pip3 install cn2an
import cn2an num1 = 101 num2 = '三百六十九' # 將num1轉(zhuǎn)成中文數(shù)字 num1_new = cn2an.an2cn(num1) # 講num2轉(zhuǎn)成阿拉伯?dāng)?shù)字 num2_new = cn2an.cn2an(num2) print(num1_new) print(num2_new)
可以看到 101 轉(zhuǎn)換成了“一百零一”,”三百六十九”轉(zhuǎn)換成了 369。因此在項(xiàng)目中要想把【等級(jí)x銷售表.xlsx】中的x換成中文數(shù)字,其實(shí)就是把保存文件夾代碼中的 num+1 先用 cn2an.an2cn() 做轉(zhuǎn)換。
總結(jié)
以上,就是功能二的相關(guān)知識(shí)點(diǎn),讓我們來(lái)用思維導(dǎo)圖來(lái)總結(jié)一下吧。
到此這篇關(guān)于用Python實(shí)現(xiàn)等級(jí)劃分的文章就介紹到這了,更多相關(guān)Python等級(jí)劃分內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python函數(shù)裝飾器常見使用方法實(shí)例詳解
這篇文章主要介紹了Python函數(shù)裝飾器常見使用方法,結(jié)合實(shí)例形式分析了Python函數(shù)裝飾器的概念、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-03-03python實(shí)現(xiàn)UDP協(xié)議下的文件傳輸
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)UDP協(xié)議下的文件傳輸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03解決安裝python庫(kù)時(shí)windows error5 報(bào)錯(cuò)的問題
今天小編就為大家分享一篇解決安裝python庫(kù)時(shí)windows error5 報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-10-10python 利用openpyxl讀取Excel表格中指定的行或列教程
這篇文章主要介紹了python 利用openpyxl讀取Excel表格中指定的行或列教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-02-02