|
实现多级目录差分,举例说明如下:
假设现有的目录结构如下: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
各级目录的名字假设以字符串的方式存放,且最后拆分出的各级目录单独存放。
实现原理
假设目录等级最多三级,那么我们如何实现呢?
我们可以通过给各级目录赋一个权重,然后计算出各个目录对应的权重值,进行比较之后,就可以得到各级目录的分类。
假设各级目录最多有1000个。
(1)一级目录的权重就为1,则一级目录的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"]
复制代码- # encoding: utf-8
- import os
- import sys
- import logging
- #学习中遇到问题没人解答?小编创建了一个Python学习交流群:153708845
- # 设置logging.basicConfig()方法的参数和配置logging.basicConfig函数
- FORMAT = '[%(funcName)s: %(lineno)d]: %(message)s'
- LEVEL = logging.INFO
- logging.basicConfig(level = LEVEL, format=FORMAT)
- '''
- * 获取二级标题所在目录名
- * 返回值:二级目录标题名
- 目录与数值对应关系:
- 1.1 ~ 1.100 ==> 1*1000+1 ~ 1*1000+100
- 2.1 ~ 2.100 ==> 2*1000+1 ~ 2*1000+100
- '''
- def judge_second_directory(get_num):
- for i in range(1, 1001, 1):
- if get_num > i * 1000 and get_num < (i+1)*1000:
- return str(i) + ".1"
- return None
- '''
- * 获取三级标题所在目录名
- * 返回值:三级目录标题名
- 目录与数值对应关系:
- 1.1.1 ~ 1.1.100 ==> 1*1000000+1*1000+1 ~ 1*1000000+1*1000+100
- 1.2.1 ~ 1.2.1000 ==> 1*1000000+2*1000+1 ~ 1*1000000+2*1000+1000
- '''
- def judge_three_directory(get_num):
- ret_str = None
- for i in range(1, 1001, 1):
- # 判断二级标题
- if get_num > i * 1000000 and get_num < (i+1)*1000000:
- ret_str = str(i) + "."
- for j in range(1, 1001, 1):
- # 判断三级标题
- if get_num > i*1000000 + j*1000 and get_num < i*1000000 + (j+1)*1000:
- ret_str += str(j) + '.1'
- return ret_str
- return None
- '''
- 按目录进行分类:
- 分类原理:
- (1) 一级目录:
- 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+1000
- 1.2.1 ~ 1.2.1000 ==> 1*1000000+2*1000+1 ~ 1*1000000+2*1000+1000
- '''
- def dirctory_classify(directory_list):
- parent_directory = []
- second_directory = {}
- three_directory = {}
- for directory_item in directory_list:
- num_list = directory_item.split(".")
- # 开始按目录进行分类
- if len(num_list) == 1: # 一级目录
- parent_directory.append(directory_item)
- elif len(num_list) == 2: # 二级目录
- # 例:1.1 ==> 1*1000+1
- get_num = int(num_list[0]) * 1000 + int(num_list[1])
- dir_tmp = judge_second_directory(get_num)
- if dir_tmp == None:
- continue
- if dir_tmp not in second_directory:
- second_directory[dir_tmp] = [directory_item]
- else:
- tmp_list = second_directory[dir_tmp]
- tmp_list.append(directory_item)
- second_directory[dir_tmp] = tmp_list
- elif len(num_list) == 3: # 三级目录
- # 例:1.1.100 ==> 1*1000000+1*1000+100
- get_num = int(num_list[0])*1000000 + int(num_list[1])*1000 + int(num_list[2])
- dir_tmp = judge_three_directory(get_num)
- if dir_tmp == None:
- continue
- if dir_tmp not in three_directory:
- three_directory[dir_tmp] = [directory_item]
- else:
- tmp_list = three_directory[dir_tmp]
- tmp_list.append(directory_item)
- three_directory[dir_tmp] = tmp_list
- else:
- logging.error("这是一个超过三级目录的条目!!!!")
- logging.error("num: %s" % directory_item)
- return [parent_directory, second_directory, three_directory]
- if __name__ == '__main__':
- 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"]
- directory = dirctory_classify(original_data)
- parent_directory = directory[0]
- second_directory = directory[1]
- three_directory = directory[2]
- print ("一级目录:", parent_directory)
- print ("二级目录:", second_directory)
- print ("三级目录:", three_directory)
复制代码 运行测试:
可以看出,测试结果符合预期,一共有三级目录。各级目录中的目录结构也划分了出来。
来源:https://www.cnblogs.com/djdjdj123/p/18204395
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|