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 importos3 importsys4 importlogging5
6 #设置logging.basicConfig()方法的参数和配置logging.basicConfig函数
7 FORMAT = '[%(funcName)s: %(lineno)d]: %(message)s'
8 LEVEL =logging.INFO9 logging.basicConfig(level = LEVEL, format=FORMAT)10
11
12 '''
13 * 获取二级标题所在目录名14 * 返回值:二级目录标题名15 目录与数值对应关系:16 1.1 ~ 1.100 ==> 1*1000+1 ~ 1*1000+10017 2.1 ~ 2.100 ==> 2*1000+1 ~ 2*1000+10018 '''
19 defjudge_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 returnNone24
25
26 '''
27 * 获取三级标题所在目录名28 * 返回值:三级目录标题名29 目录与数值对应关系:30 1.1.1 ~ 1.1.100 ==> 1*1000000+1*1000+1 ~ 1*1000000+1*1000+10031 1.2.1 ~ 1.2.1000 ==> 1*1000000+2*1000+1 ~ 1*1000000+2*1000+100032 '''
33 defjudge_three_directory(get_num):34 ret_str =None35 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 returnret_str44 returnNone45
46
47 '''
48 按目录进行分类:49 分类原理:50 (1) 一级目录:51 1 ~ 1000 ==> 1 ~ 100052 一级目录所占的数字范围:1 ~ 100053 (2) 二级目录:54 1.1 ~ 1.100 ==> 1*1000+1 ~ 1*1000+10055 2.1 ~ 2.100 ==> 2*1000+1 ~ 2*1000+10056 ''''''
57 ''''''
58 100.1 ~ 100.100 ==> 100*1000+1 ~ 100*1000+10059 1000.1 ~ 1000.1000 ==> 1000*1000+1 ~ 1000*1000 + 100060 二级目录所占的数字范围:1000 ~ 100100061 (3) 三级目录:62 1.1.1 ~ 1.1.100 ==> 1*1000000+1*1000+1 ~ 1*1000000+1*1000+10063 1.1000.1 ~ 1.1000.1000 ==> 1*1000000+1000*1000+100064 1.2.1 ~ 1.2.1000 ==> 1*1000000+2*1000+1 ~ 1*1000000+2*1000+100065 '''
66 defdirctory_classify(directory_list):67 parent_directory =[]68 second_directory ={}69 three_directory ={}70 for directory_item indirectory_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 insecond_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_list87 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 inthree_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_list99 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
运行测试:
可以看出,测试结果符合预期,一共有三级目录。各级目录中的目录结构也划分了出来。