操作系統: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。
經過差分后,得到的各級目錄為:
二級目錄: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
各級目錄的名字假設以字符串的方式存放,且最后拆分出的各級目錄單獨存放。
假設目錄等級最多三級,那么我們如何實現呢?
我們可以通過給各級目錄賦一個權重,然后計算出各個目錄對應的權重值,進行比較之后,就可以得到各級目錄的分類。
假設各級目錄最多有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
最后,我們只需要將目錄按照上述的公式計算出權重,就可以根據權重獲得目錄所在的目錄結構是什么。
["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)
運行測試:
可以看出,測試結果符合預期,一共有三級目錄。各級目錄中的目錄結構也划分了出來。