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