Python實現拆分多級目錄的方式


1 環境

操作系統:Windows10

Python版本:Python3.7

2 簡介

實現多級目錄差分,舉例說明如下:

假設現有的目錄結構如下:1、2、2.1、2.2、2.3、2.4、3、4、5、6、6.1、6.1.1、6.1.2、6.1.3、6.1.4、6.2、6.3、6.4、7、8、9、10。

經過差分后,得到的各級目錄為:

一級目錄:1、2、3、4、5、6、7、8、9、10

二級目錄:2.1、2.2、2.3、2.4和6.1、6.2、6.3、6.4

三級目錄:6.1.1、6.1.2、6.1.3、6.1.4

各級目錄的名字假設以字符串的方式存放,且最后拆分出的各級目錄單獨存放。

3 實現原理

假設目錄等級最多三級,那么我們如何實現呢?

我們可以通過給各級目錄賦一個權重,然后計算出各個目錄對應的權重值,進行比較之后,就可以得到各級目錄的分類。

假設各級目錄最多有1000個。

(1)一級目錄的權重就為1,則一級目錄的1到1000對應的權重就是1到1000。

1 ~ 1000 ==> 1 ~ 1000

一級目錄所占的數值范圍:1 ~ 1000

(2)二級目錄的權重賦值如下:

1.1 ~ 1.100 ==> 1*1000+1 ~ 1*1000+100

2.1 ~ 2.100 ==> 2*1000+1 ~ 2*1000+100

'''''' ''''''

100.1 ~ 100.100 ==> 100*1000+1 ~ 100*1000+100

1000.1 ~ 1000.1000 ==> 1000*1000+1 ~ 1000*1000 + 1000

二級目錄所占的數值范圍:1000 ~ 1001000

(3) 三級目錄的權重賦值如下:

1.1.1 ~ 1.1.100 ==> 1*1000000+1*1000+1 ~ 1*1000000+1*1000+100

1.1000.1 ~ 1.1000.1000 ==> 1*1000000+1000*1000+1~ 1*1000000+1000*1000+1000

1.2.1 ~ 1.2.1000 ==> 1*1000000+2*1000+1 ~ 1*1000000+2*1000+1000

最后,我們只需要將目錄按照上述的公式計算出權重,就可以根據權重獲得目錄所在的目錄結構是什么。

4 代碼實現

測試數據:["1", "2", "2.1", "2.2", "2.3", "2.4", "3", "4", "5", "6", "6.1", "6.1.1", "6.1.2", "6.1.3", "6.1.4", "6.2", "6.3", "6.4", "7", "8", "9", "10"]

  1 # encoding: utf-8
  2 import os 
  3 import sys
  4 import logging
  5 
  6 # 設置logging.basicConfig()方法的參數和配置logging.basicConfig函數
  7 FORMAT = '[%(funcName)s: %(lineno)d]: %(message)s'
  8 LEVEL = logging.INFO
  9 logging.basicConfig(level = LEVEL, format=FORMAT)
 10 
 11 
 12 '''
 13 * 獲取二級標題所在目錄名
 14 * 返回值:二級目錄標題名
 15 目錄與數值對應關系:
 16 1.1 ~ 1.100 ==>  1*1000+1 ~ 1*1000+100
 17 2.1 ~ 2.100 ==>  2*1000+1 ~ 2*1000+100
 18 '''
 19 def judge_second_directory(get_num):
 20     for i in range(1, 1001, 1):
 21         if get_num > i * 1000 and get_num < (i+1)*1000:
 22             return str(i) + ".1"
 23     return None
 24 
 25 
 26 '''
 27 * 獲取三級標題所在目錄名
 28 * 返回值:三級目錄標題名
 29 目錄與數值對應關系:
 30 1.1.1 ~ 1.1.100  ==> 1*1000000+1*1000+1 ~ 1*1000000+1*1000+100
 31 1.2.1 ~ 1.2.1000 ==> 1*1000000+2*1000+1 ~ 1*1000000+2*1000+1000
 32 '''
 33 def judge_three_directory(get_num):
 34     ret_str = None
 35     for i in range(1, 1001, 1):
 36         # 判斷二級標題
 37         if get_num > i * 1000000 and get_num < (i+1)*1000000:  
 38             ret_str = str(i) + "."
 39         for j in range(1, 1001, 1):
 40             # 判斷三級標題 
 41             if get_num > i*1000000 + j*1000 and get_num < i*1000000 + (j+1)*1000:
 42                 ret_str += str(j) + '.1'
 43                 return ret_str
 44     return None   
 45 
 46 
 47 '''
 48 按目錄進行分類:
 49 分類原理:
 50 (1) 一級目錄:
 51 1 ~ 1000     ==>  1 ~ 1000
 52 一級目錄所占的數字范圍:1 ~ 1000
 53 (2) 二級目錄:
 54 1.1 ~ 1.100 ==>  1*1000+1 ~ 1*1000+100
 55 2.1 ~ 2.100 ==>  2*1000+1 ~ 2*1000+100
 56 ''''''
 57 ''''''
 58 100.1 ~ 100.100    ==> 100*1000+1 ~ 100*1000+100
 59 1000.1 ~ 1000.1000 ==> 1000*1000+1 ~ 1000*1000 + 1000
 60 二級目錄所占的數字范圍:1000 ~ 1001000
 61 (3) 三級目錄:
 62 1.1.1 ~ 1.1.100        ==> 1*1000000+1*1000+1 ~ 1*1000000+1*1000+100
 63 1.1000.1 ~ 1.1000.1000 ==> 1*1000000+1000*1000+1000
 64 1.2.1 ~ 1.2.1000 ==> 1*1000000+2*1000+1 ~ 1*1000000+2*1000+1000
 65 '''
 66 def dirctory_classify(directory_list):
 67     parent_directory = []
 68     second_directory = {}
 69     three_directory  = {}
 70     for directory_item in directory_list:
 71         num_list = directory_item.split(".")
 72         # 開始按目錄進行分類
 73         if len(num_list) == 1:   # 一級目錄
 74             parent_directory.append(directory_item)
 75         elif len(num_list) == 2: # 二級目錄
 76             # 例:1.1 ==> 1*1000+1
 77             get_num = int(num_list[0]) * 1000 + int(num_list[1])
 78             dir_tmp = judge_second_directory(get_num)
 79             if dir_tmp == None:
 80                 continue
 81             if dir_tmp not in second_directory:
 82                 second_directory[dir_tmp] = [directory_item]
 83             else:
 84                 tmp_list = second_directory[dir_tmp]
 85                 tmp_list.append(directory_item)
 86                 second_directory[dir_tmp] = tmp_list
 87         elif len(num_list) == 3: # 三級目錄
 88             # 例:1.1.100 ==> 1*1000000+1*1000+100
 89             get_num = int(num_list[0])*1000000 + int(num_list[1])*1000 + int(num_list[2])
 90             dir_tmp = judge_three_directory(get_num)
 91             if dir_tmp == None:
 92                 continue
 93             if dir_tmp not in three_directory:
 94                 three_directory[dir_tmp] = [directory_item]
 95             else:
 96                 tmp_list = three_directory[dir_tmp]
 97                 tmp_list.append(directory_item)
 98                 three_directory[dir_tmp] = tmp_list
 99         else:
100             logging.error("這是一個超過三級目錄的條目!!!!")
101             logging.error("num: %s" % directory_item)
102     return [parent_directory, second_directory, three_directory]
103 
104 
105 if __name__ == '__main__':
106     original_data = ["1", "2", "2.1", "2.2", "2.3", "2.4", "3", "4", "5", "6", "6.1", "6.1.1", "6.1.2", "6.1.3", "6.1.4", "6.2", "6.3", "6.4", "7", "8", "9", "10"]
107     directory = dirctory_classify(original_data)
108 
109     parent_directory = directory[0]
110     second_directory = directory[1]
111     three_directory  = directory[2]
112 
113     print ("一級目錄:", parent_directory)
114     print ("二級目錄:", second_directory)
115     print ("三級目錄:", three_directory)
View Code

運行測試:

可以看出,測試結果符合預期,一共有三級目錄。各級目錄中的目錄結構也划分了出來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM