首页 > 编程语言 >Python教程:拆分多级目录的方法

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

时间:2024-05-21 16:42:27浏览次数:25  
标签:教程 6.1 Python 1000000 num 拆分 directory 目录 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、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 ==> 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)

运行测试:
在这里插入图片描述
可以看出,测试结果符合预期,一共有三级目录。各级目录中的目录结构也划分了出来。

标签:教程,6.1,Python,1000000,num,拆分,directory,目录,1000
From: https://www.cnblogs.com/djdjdj123/p/18204395

相关文章

  • mac anaconda pycharm python3.6 tensorflow 1.1.0
     condaconfig--addchannelshttps://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/osx-arm64/condacreate-npy36python=3.6     ps:当加载卡住的时候,强制退出存在下载的包都消失的情况......
  • 在Docker中安装GaussDB的ODBC驱动并添加Python测试代码
    #使用官方的Ubuntu20.04镜像作为基础镜像FROMubuntu:20.04#设置环境变量以避免交互式安装提示ENVDEBIAN_FRONTEND=noninteractive#更新包列表并安装必要的软件包RUNapt-getupdate&&\apt-getinstall-y\wget\curl\gnupg2\apt-transport-https......
  • 在Docker中安装SQL Server的ODBC驱动并添加Python测试代码
    #使用官方的Ubuntu20.04镜像作为基础镜像FROMubuntu:20.04#设置环境变量以避免交互式安装提示ENVDEBIAN_FRONTEND=noninteractive#更新包列表并安装必要的软件包RUNapt-getupdate&&\  apt-getinstall-y\  wget\  curl\  gnupg2\ ......
  • 在Docker中安装MySQL的ODBC驱动并添加Python测试代码
    #使用官方的Ubuntu镜像作为基础镜像FROMubuntu:20.04#设置环境变量以避免交互式安装提示ENVDEBIAN_FRONTEND=noninteractive#更新包列表并安装必要的软件包RUNapt-getupdate&&\  apt-getinstall-y\  build-essential\  curl\  apt-trans......
  • 在Docker中安装PostgreSQL的ODBC驱动并添加Python测试代码
    #使用官方的Ubuntu镜像作为基础镜像FROMubuntu:20.04#设置环境变量以避免交互式安装提示ENVDEBIAN_FRONTEND=noninteractive#更新包列表并安装必要的软件包RUNapt-getupdate&&\  apt-getinstall-y\  build-essential\  unixodbc\  unixo......
  • C#如何用最简单方法调用Python?
    最近有群友咨询C#如何调用Python?小编尝试Python.NET过程中遭遇的版本兼容性和环境配置难题,小编决定寻找一个更为简单、稳定且对初学者友好的解决方案。小编搜索一番,除了Python.NET之外,还有其他途径能够帮助我们轻松地在C#项目调用Python脚本,那就是通过命令行调用,使用System.Diagn......
  • Python之快排算法
    快排算法的思路:从list中取出下标为0的值定义三个list进行循环,大于list[0]放入一个A,小于的放入B,其他的放入C拼接:A+C+B代码实现:list=[13,8,11,17,5,6,1,1,1]defQuickSort(list):iflen(list)<=1:#判断如果小于等于1,则无需排序,直接返回即可......
  • Python/Go 面试题目整理
    目录一、Python基础知识1.1可变与不可变数据类型1.8深浅拷贝1.2PEP8编程规范1.3匿名函数1.4装饰器1.5迭代器1.6生成器1.7面向对象编程思想1.7.1Python中的__new__和__init__的区别1.7.2反射1.7.3面向对象1.7.4鸭子类型1.7.5你对Python的继承怎么看?1.9GC机制1.10......
  • 蟒蛇书(Python编程:从入门到实践)第17章使用API 17.1.4处理API响应报错Caused by ProxyEr
    书上提供的原始代码:importrequests#执行API调用并存储响应url='https://api.github.com/search/repositories?q=language:python&sort=stars'headers={'Accept':'application/vnd.github.v3+json'}r=requests.get(url,headers=headers)prin......
  • 【Azure Storage Account】Azure 存储服务计算Blob的数量和大小的Python代码
    问题描述介绍一段Python脚本,可以在微软云中国区使用。用于计算AzureStorageAccount中Container中Blob类型文件的数量和大小,脚本中允许按照容器,层(热/冷/归档),前缀,软删除/非软删除来计算数量和容量大小,默认使用的时间为以Blob的最后修改时间作为参考。执行结果参考: 参数......