當前位置:
首頁 > 最新 > 利用批處理思維自動創建目錄樹

利用批處理思維自動創建目錄樹

不知道大家有沒有產生過這樣的需求,做為學校信息管理員或信息技術教師,我們經常會需要進行種種「批處理」操作。比如批量刪除文件、批量命名照片、批量配置機器等等。從時代發展的方向來看,數據時代,我們一定不可避免的會遇到各種數據或文件的整理工作。不管你是一名銷售人員、還是公司的HR、部門主管,你都會面臨一個時間成本與效率產出的問題。同樣的重複性工作,如果你能利用程序設計工具或者思想快速實現並形成標準,那麼你可能就會成為團隊的上層核心。想像一下,你是一個大區銷售經理,拿到各個縣市的銷售數據後,能快速完成數據表格的合併,並提取出不同性別,不同年齡、不同職業人的購買意向,並繪製出精美的折線圖……

我要說的就是,程序設計思維,將來真的不僅僅是程序猿的專利。社會各行各業將來在人工智慧時代對計算機的使用,絕不限於辦公軟體基礎。要麼你直接操刀寫一點腳本,來做一些分析與匯總;要麼你可以明確方向、搭好框架、分配任務,用計算機解決問題的思維運籌唯握。這就是為什麼,我們高中階段信息技術要改革,而且必須要改革。以往那些學點文本、做個表排個序、PS摳個圖、整個個人主頁這些東西真的已經全社會都普及了。我們高中信息技術教師和學生在長達10多年的信息素養教育後,在實踐和理論層面確定有些跟不上節奏了……

窮則變,變則通。所以,我們要站在專業化的高視角去看待技術、利用技術。只要用深度思維理解原理、用計算思維指引方法、用數字化學習精於實踐,那麼一切變化就會歸於不變,一切問題皆為虛妄,必可從容處之。

好了,接下來上乾貨。我們來解決這樣一個問題,批量創建多重文件來。按照【年份】-年級-科目-教師名-【周次-備課文件】的層次結構,在FTP伺服器做好目錄,用於集體備課存檔與檢查。這個是筆者學校多年的常規性工作,以往多數藉助BAT批處理。由於功能限制和交互落後,今天 我們用Python來進行改寫。各位在機房FTP有同樣需求時,可以借鑒使用。也可以做為將來項目式教學中列表、字典、循環結合項目的課堂案例。

需求分析:建立文件夾層次,核心部分為年級-科目-教師名這三個層次。根目錄手工建立,內重目錄是相同的,可以直接Copy。由於涉及的層次不是很多,考慮用多重循環來實現。

概要設計:文件夾結構就是一棵多叉樹,其邏輯結構的最佳實現應該更偏向於鏈表。體現在程序層面適合一個結點做為一個類,數據做為屬性、遍歷做為方法。清華經典教材嚴蔚敏C語言版里用的結構體也是同樣道理。本例僅基於教學功能基礎實現,我們用循環嵌套的結構化實現方法來完成。

詳細設計:我們分為兩步,第一是構造一個字典與列表嵌套的結構存放字元串,遍歷結構創建所有文件夾;第二是從Excel表中讀取名單數據並格式化成我們想要的字典。對於列表和字典不清楚的請自行百度其基本語法。

01

構造多重字典,生成目錄

這裡是使用了迭代式的循環寫法,擴展知識為makedirs使用,就是一句代碼,自學即可。其它的字典的鍵值對訪問寫法,無非是一些課堂基礎知識的熟練度問題。

import os

dic={

"高一":{"語文":["李白","杜甫","白居易"],"數學":["華羅庚","陳景潤","祖沖之","笛卡爾"],"英語":["Tom","Lilei"]},

"高二":{"語文":["張三","李四","王五","趙六"],"數學":["萊布尼茲","拉格朗日"],"英語":["Hanmeimei","UncleW"]},

"高三":{"語文":["魯迅","李大釗","陳獨秀"],"數學":["趙與","錢或","孫非"],"英語":["Jim","Smith","John","Lily","Lucy"]},

}

for key in dic:

#print(key)

os.makedirs("C:\bk\"+key)

for k in dic[key]:

#print(" "+k)

os.makedirs("C:\bk\"+key+"\"+k)

list=dic[key][k]

for l in list:

#print(" "+l)

os.makedirs("C:\bk\"+key+"\"+k+"\"+l)

#以下完成Copy公共目錄

02

Excel 讀取名單並格式化為所需字典

讀取Excle在不同語言中複雜程序各不相同,我們百度以後看到一篇普及文章。https://www.cnblogs.com/ivanpan/p/7300335.html,裡面有Python對接Excel操作行列、單元格的完整例子。刪掉多餘,留下我們需要的訪問列部分。sheet.col_values(i)就是第i列,我們拿出第一個元素也是標題來,和下面的列表組成鍵值對,就得到了一個關於科目的字典。年級名再和這些字典組成鍵值對,就得到了一個關於年級的字典。最後一合併就搞定。也就是說,我們寫多重迭代循環時,一個比較好的思路是先寫最內兩層的i、j循環(行列遍歷),再依次向外迭代。當然如果你習慣於其它寫法也可以,總之要有適合自己的快速實現思路。

#參考:https://www.cnblogs.com/ivanpan/p/7300335.html

import xlrd

dic={}

#文件位置

ExcelFile=xlrd.open_workbook(r"C:list.xls")

#獲取目標EXCEL文件sheet名

sheet_names=ExcelFile.sheet_names()#得到表名列表

#print(sheet_names)

for sn in sheet_names:#遍歷每個表

dickm={}#注意,必須定義在迭代器內

sheet=ExcelFile.sheet_by_name(sn)#獲得表對象

#列印sheet的名稱,行數,列數

cols=sheet.ncols

rows=sheet.nrows

for i in range(cols):#遍歷列,問題核心

kemu=sheet.cell(0,i).value#列標題單拿出來

#print(kemu+"=》")

col=sheet.col_values(i)#第二列內容

col.pop(0)

"""

list=[]#準備一個放人員的列表

list.clear()

for j in range(1,rows):#非空人員放入列表

cellVal=sheet.cell(j,i).value

if not cellVal=="":

list.append(cellVal)

"""

dickm[kemu]=col#科目字典加值

dic[sn]=dickm#總字典加科目

print(dic)

最後,當我們列印出來的dic和前面假定的dic完全匹配的時候,就基本可以收工了,因為剩下的只是合併工作。為了顯得有條理一些,我們可以把前面的方法寫成函數。這一部分,鍛煉了我們學生的協同處理能力(實踐力),當然前提是兩者化歸的過程需要良好的大局觀存在(構建力)。

進一步,思考,當文件夾層次更多時,比如超過5層,我們可能就要換用開頭說的另一種方法了。所以這一部分,也可以再學生學習了面向對象和遞歸演算法後,做為一個備用練習項目。估計必修模塊中,未必會涉及樹型結構編程這樣複雜的深層知識,所以就當拋磚引玉了,各位老師可以自行研究。

最後,普及一個老師們糾結的問題,Python該學什麼版本,入門改用什麼環境。我的建議:初學者用Python3,開發環境用NotePadd++即可,輕量適用。將來做項目,再用PyCharm之類的IDE,NotePad++是個高級記事本,讓它支持Python代碼運行,只需要在運行菜單中輸入一句配置命令:

cmd /k python "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT

具體請參考:http://www.cnblogs.com/zhcncn/p/3969419.html。

——專註編程思路,實戰理解分析。歡迎大家關注本公眾號,一起鍛煉計算思維,一起實現我們的專業化。

附:總體源碼https://pan.baidu.com/s/1D6_fjNwyscmTorA9_vPdEg 密碼: 8r55

import xlrd

import os

def createFolder(dic):

for key in dic:

#print(key)

os.makedirs("C:\bk\"+key)

for k in dic[key]:

#print(" "+k)

os.makedirs("C:\bk\"+key+"\"+k)

list=dic[key][k]

for l in list:

#print(" "+l)

os.makedirs("C:\bk\"+key+"\"+k+"\"+l)

#以下完成Copy公共目錄

dict={}

#文件位置

ExcelFile=xlrd.open_workbook(r"C:list.xls")

#獲取目標EXCEL文件sheet名

sheet_names=ExcelFile.sheet_names()#得到表名列表

#print(sheet_names)

for sn in sheet_names:#遍歷每個表

dickm={}#注意,必須定義在迭代器內

sheet=ExcelFile.sheet_by_name(sn)#獲得表對象

#列印sheet的名稱,行數,列數

cols=sheet.ncols

rows=sheet.nrows

for i in range(cols):#遍歷列

kemu=sheet.cell(0,i).value#列標題單拿出來

#print(kemu+"=》")

col=sheet.col_values(i)#第二列內容

col.pop(0)#去掉第一個元素(標題)

while "" in col:#去掉列中的空元素

col.remove("")

dickm[kemu]=col#科目字典加值

dict[sn]=dickm#總字典加科目

createFolder(dict)


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

萌寵家庭寄養來啦!『』毛孩子『』紅紅火火過大年
ZQ留學服務工作室2018年開門大吉——感謝信任與陪伴

TAG:全球大搜羅 |