“只有提升维度,不断抽象,才能够看清低维度的事物的本质。” - 柏拉图-理想国
问题:
遍历系统某个文件夹下面的所有子文件夹和文件,输出子文件夹的文件的名称。
解决方案:
获取系统文件夹的路径,创建一个字典。
列出当前文件夹下的文件夹和文件,文件夹存储为字典的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 包含目录: [] 包含文件: [] '''