翼度科技»论坛 编程开发 python 查看内容

Python教程:拆分多级目录的方法

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
实现多级目录差分,举例说明如下:
假设现有的目录结构如下: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. 1 ~ 1000 ==> 1 ~ 1000
复制代码
一级目录所占的数值范围:1 ~ 1000
(2)二级目录的权重赋值如下:
  1. 1.1 ~ 1.100 ==> 1*1000+1 ~ 1*1000+100
  2. 2.1 ~ 2.100 ==> 2*1000+1 ~ 2*1000+100
  3. '''''' ''''''
  4. 100.1 ~ 100.100 ==> 100*1000+1 ~ 100*1000+100
  5. 1000.1 ~ 1000.1000 ==> 1000*1000+1 ~ 1000*1000 + 1000
复制代码
二级目录所占的数值范围:1000 ~ 1001000
(3) 三级目录的权重赋值如下:
  1. 1.1.1 ~ 1.1.100 ==> 1*1000000+1*1000+1 ~ 1*1000000+1*1000+100
  2. 1.1000.1 ~ 1.1000.1000 ==> 1*1000000+1000*1000+1~ 1*1000000+1000*1000+1000
  3. 1.2.1 ~ 1.2.1000 ==> 1*1000000+2*1000+1 ~ 1*1000000+2*1000+1000
复制代码
最后,我们只需要将目录按照上述的公式计算出权重,就可以根据权重获得目录所在的目录结构是什么。
代码实现

测试数据:
  1. ["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. #学习中遇到问题没人解答?小编创建了一个Python学习交流群:153708845
  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. 1.1 ~ 1.100 ==>  1*1000+1 ~ 1*1000+100
  15. 2.1 ~ 2.100 ==>  2*1000+1 ~ 2*1000+100
  16. '''
  17. def judge_second_directory(get_num):
  18.     for i in range(1, 1001, 1):
  19.         if get_num > i * 1000 and get_num < (i+1)*1000:
  20.             return str(i) + ".1"
  21.     return None
  22. '''
  23. * 获取三级标题所在目录名
  24. * 返回值:三级目录标题名
  25. 目录与数值对应关系:
  26. 1.1.1 ~ 1.1.100  ==> 1*1000000+1*1000+1 ~ 1*1000000+1*1000+100
  27. 1.2.1 ~ 1.2.1000 ==> 1*1000000+2*1000+1 ~ 1*1000000+2*1000+1000
  28. '''
  29. def judge_three_directory(get_num):
  30.     ret_str = None
  31.     for i in range(1, 1001, 1):
  32.         # 判断二级标题
  33.         if get_num > i * 1000000 and get_num < (i+1)*1000000:
  34.             ret_str = str(i) + "."
  35.         for j in range(1, 1001, 1):
  36.             # 判断三级标题
  37.             if get_num > i*1000000 + j*1000 and get_num < i*1000000 + (j+1)*1000:
  38.                 ret_str += str(j) + '.1'
  39.                 return ret_str
  40.     return None
  41. '''
  42. 按目录进行分类:
  43. 分类原理:
  44. (1) 一级目录:
  45. 1 ~ 1000     ==>  1 ~ 1000
  46. 一级目录所占的数字范围:1 ~ 1000
  47. (2) 二级目录:
  48. 1.1 ~ 1.100 ==>  1*1000+1 ~ 1*1000+100
  49. 2.1 ~ 2.100 ==>  2*1000+1 ~ 2*1000+100
  50. ''''''
  51. ''''''
  52. 100.1 ~ 100.100    ==> 100*1000+1 ~ 100*1000+100
  53. 1000.1 ~ 1000.1000 ==> 1000*1000+1 ~ 1000*1000 + 1000
  54. 二级目录所占的数字范围:1000 ~ 1001000
  55. (3) 三级目录:
  56. 1.1.1 ~ 1.1.100        ==> 1*1000000+1*1000+1 ~ 1*1000000+1*1000+100
  57. 1.1000.1 ~ 1.1000.1000 ==> 1*1000000+1000*1000+1000
  58. 1.2.1 ~ 1.2.1000 ==> 1*1000000+2*1000+1 ~ 1*1000000+2*1000+1000
  59. '''
  60. def dirctory_classify(directory_list):
  61.     parent_directory = []
  62.     second_directory = {}
  63.     three_directory  = {}
  64.     for directory_item in directory_list:
  65.         num_list = directory_item.split(".")
  66.         # 开始按目录进行分类
  67.         if len(num_list) == 1:   # 一级目录
  68.             parent_directory.append(directory_item)
  69.         elif len(num_list) == 2: # 二级目录
  70.             # 例:1.1 ==> 1*1000+1
  71.             get_num = int(num_list[0]) * 1000 + int(num_list[1])
  72.             dir_tmp = judge_second_directory(get_num)
  73.             if dir_tmp == None:
  74.                 continue
  75.             if dir_tmp not in second_directory:
  76.                 second_directory[dir_tmp] = [directory_item]
  77.             else:
  78.                 tmp_list = second_directory[dir_tmp]
  79.                 tmp_list.append(directory_item)
  80.                 second_directory[dir_tmp] = tmp_list
  81.         elif len(num_list) == 3: # 三级目录
  82.             # 例:1.1.100 ==> 1*1000000+1*1000+100
  83.             get_num = int(num_list[0])*1000000 + int(num_list[1])*1000 + int(num_list[2])
  84.             dir_tmp = judge_three_directory(get_num)
  85.             if dir_tmp == None:
  86.                 continue
  87.             if dir_tmp not in three_directory:
  88.                 three_directory[dir_tmp] = [directory_item]
  89.             else:
  90.                 tmp_list = three_directory[dir_tmp]
  91.                 tmp_list.append(directory_item)
  92.                 three_directory[dir_tmp] = tmp_list
  93.         else:
  94.             logging.error("这是一个超过三级目录的条目!!!!")
  95.             logging.error("num: %s" % directory_item)
  96.     return [parent_directory, second_directory, three_directory]
  97. if __name__ == '__main__':
  98.     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"]
  99.     directory = dirctory_classify(original_data)
  100.     parent_directory = directory[0]
  101.     second_directory = directory[1]
  102.     three_directory  = directory[2]
  103.     print ("一级目录:", parent_directory)
  104.     print ("二级目录:", second_directory)
  105.     print ("三级目录:", three_directory)
复制代码
运行测试:

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

来源:https://www.cnblogs.com/djdjdj123/p/18204395
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具