python - 遍历某个文件夹下的所有子文件夹和文件名称

“只有提升维度,不断抽象,才能够看清低维度的事物的本质。”  -  柏拉图-理想国

 

问题:

遍历系统某个文件夹下面的所有子文件夹和文件,输出子文件夹的文件的名称。

解决方案:

获取系统文件夹的路径,创建一个字典。

列出当前文件夹下的文件夹和文件,文件夹存储为字典的key1,文件存储为字典的key2

遍历字典中的每一个文件夹和文件

讨论:

当文件/文件夹名称为汉字时,没有进行测试。

如何依据key,快速查找当前key及以该key为父目录的所有子目录和子文件,没有实现。

封装性不好,class和独立函数混合。

 

源代码:

# coding=utf-8

from __future__ import print_function
from __future__ import with_statement
import os
import sys

class traverse_name():
    def __init__(self, path, father_dir):
        self.path = path + father_dir

    def show_name(self):
        '''显示当前路径下的文件夹和文件'''
        # print(os.listdir(self.path))
        list0 = os.listdir(self.path)
        # print(os.walk(self.path))
        list_dir = []
        list_file = []
        for i in list0:
            if os.path.isdir(self.path + '\\' + i):
                list_dir.append(i)
            else:
                list_file.append(i)
        return list_dir, list_file

def iter_dir(abs_path, dir_father_path, dir_res):
    if 0 == len(dir_res[dir_father_path]['dir']): # 父目录下没有子目录
        return 0

    for dir in dir_res[dir_father_path]['dir']:  # \\A
        dir_son_path = dir_father_path + '\\' + dir  # \\A\\A1
        dir_res[dir_son_path] = dict()
        traverse = traverse_name(abs_path, dir_son_path) # abs_path绝对路径, dir_path相对路径
        dir_res[dir_son_path]['dir'], dir_res[dir_son_path]['file'] = traverse.show_name()
        # if 0 != len(dir_res[dir_path]['dir']): # 父目录下存在子目录
        #     for dir_son_path in dir_res[dir_path]['dir']:
        #         dir_path = dir_father_path + '\\' + dir_son_path
        iter_dir(abs_path, dir_son_path, dir_res) # 按实际情况进行递归

def show_res(result):
    print(result)
    list0 = []
    for key in result: # 取字典中的key
        # print(len(key))
        list0.append((len(key), key))
        list0.sort()
        # print(list0)
    for i in range(0,len(list0),1):
        key = list0[i][1]
        print('目录:',key)
        print('  包含目录:  ', result[key]['dir'] )
        print('  包含文件:  ', result[key]['file'])

if __name__ == '__main__':
    # filename = '1.txt'
    # os.remove(filename)
    # print(os.getcwd())
    # f = open(filename, 'w+')
    # f.writelines('a\n')
    # f.writelines('ab\n')
    # f.writelines('abc\n')
    # f.close()
    # f = open(filename, 'r+')
    # print(f.readline())
    # print(f.readline())
    # print(f.readline())
    # print(f.readline())
    # print(f.readline())
    # f.close()

    # list = os.listdir(dir)  # 列出目录下的所有文件和目录
    # if os.path.isdir(filepath):  # 如果filepath是目录,则再列出该目录下的所有文件
    # os.path.isfile(path):
    # elif os.path:  # 如果filepath是文件,直接列出文件名
    # os.walk(path),遍历path,返回一个对象,
    # 他的每个部分都是一个三元组,
    # ('目录x'[目录x下的目录list],目录x下面的文件)
    # os.path.join(name)
    # path = sys.path[0]

    result = dict()

    abs_path = os.getcwd() # 也可以 path = sys.path[0]
    father_dir = '\A'

    traverse = traverse_name(abs_path,father_dir)
    result[father_dir] = dict()
    result[father_dir]['dir'], result[father_dir]['file'] = traverse.show_name()

    iter_dir(abs_path, father_dir, result)

    show_res(result)
'''
{'\\A\\A1\\A12\\A121': {'file': [], 'dir': []},
'\\A\\A2\\A21\\A211': {'file': [], 'dir': []},
'\\A\\A1': {'file': ['A11.txt', 'A12.txt'], 'dir': ['A11', 'A12']},
'\\A\\A2\\A21': {'file': ['A211.txt'], 'dir': ['A211']},
'\\A\\A3': {'file': [], 'dir': []},
'\\A\\A2': {'file': [], 'dir': ['A21']},
'\\A': {'file': ['A1.txt', 'A2.txt', 'A3.txt'], 'dir': ['A1', 'A2', 'A3']},
'\\A\\A1\\A12': {'file': ['A121.txt'], 'dir': ['A121']},
'\\A\\A1\\A11': {'file': ['A111.txt'], 'dir': []}}
目录: \A
  包含目录:   ['A1', 'A2', 'A3']
  包含文件:   ['A1.txt', 'A2.txt', 'A3.txt']
目录: \A\A1
  包含目录:   ['A11', 'A12']
  包含文件:   ['A11.txt', 'A12.txt']
目录: \A\A2
  包含目录:   ['A21']
  包含文件:   []
目录: \A\A3
  包含目录:   []
  包含文件:   []
目录: \A\A1\A11
  包含目录:   []
  包含文件:   ['A111.txt']
目录: \A\A1\A12
  包含目录:   ['A121']
  包含文件:   ['A121.txt']
目录: \A\A2\A21
  包含目录:   ['A211']
  包含文件:   ['A211.txt']
目录: \A\A1\A12\A121
  包含目录:   []
  包含文件:   []
目录: \A\A2\A21\A211
  包含目录:   []
  包含文件:   []
'''


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值