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"]

 # encoding: utf-8
import os
import sys
import logging # 设置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 = ["", "", "2.1", "2.2", "2.3", "2.4", "", "", "", "", "6.1", "6.1.1", "6.1.2", "6.1.3", "6.1.4", "6.2", "6.3", "6.4", "", "", "", ""]
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)

运行测试:

可以看出,测试结果符合预期,一共有三级目录。各级目录中的目录结构也划分了出来。

最新文章

  1. selenium 打开浏览器
  2. 【BFS】POJ 2251
  3. php 网页 301 跳转
  4. Codeforces Round #291 (Div. 2)
  5. 优化:代码移动code motion
  6. DW 图片不显示的情况 ———网页只显示字不显示图片的情况 目录下的图片名被改动不显示图片的情况
  7. cdoj Dividing Numbers 乱搞记忆化搜索
  8. GoJS学习笔记
  9. Django view(视图)
  10. Error: Could not find or load main class Test
  11. mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)
  12. Java语法基础学习DayTwelve(泛型)
  13. 在mk/rte.app.mk 256行加echo $(O_TO_EXE_DO)查看GCC参数
  14. centos 7 源代码安装mysql5.6
  15. Django常用的模板标签
  16. PHP缓存库phpFastCache
  17. 【大数据】MongoDB安装(转)
  18. Design Your Own Protocol In Five Minutes
  19. 简单的dos命令
  20. BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)

热门文章

  1. python列表的增删改查和嵌套
  2. Jmeter 常用函数(12)- 详解 __machineName
  3. JavaScript学习系列博客_24_JavaScript 原型对象
  4. python基础 Day12
  5. 8.hbase写入流程和读取流程
  6. 深入理解k8s中的访问控制(认证、鉴权、审计)流程
  7. mysql事务级别和spring中应用
  8. Kubernetes入门(一)——Kubernetes v1.18.5 安装部署
  9. Windows Server 2012 两台服务器文件同步
  10. MYSQL经典练习题,熟悉DQL