正在学习Python,实现了一个生成目录树的功能,练手小程序。可能代码写的不够好,会继续努力的,哪里写的不好的话,希望大家提出宝贵意见,共同学习。源码以及结果分享给大家
# -*-encoding: utf-8 -*- """ @version: 3.6 @time: 2018/3/7 9:12 @author: SunnyYang @title: @file: travelDir.py """ import os def traveDir(dirname,parentPath,level): #遍历目录:dirname 当前访问的目录,parentPath是dirname的父目录,level目录层级 global dirDs,levels #目录用对象表示 parentPath = os.path.join(parentPath,dirname) # 路径拼接是由 \ 连接 print(parentPath,'uuuuuuuuuuuu') #E:\课件\英语\unit one levels.setdefault(dirname,level) listOfDir = os.listdir(parentPath) # 用于返回指定的文件夹包含的文件或文件夹的名字列表 temp = {} temp.setdefault(dirname,listOfDir) # objsOfDir.append(temp) print(''.join(['(Root)' if not level else ' '*6+' '*5*(level-1)+'|---',dirname])) #-1是为了让有子文件夹的目录也跟同一级对齐 if dirname == Root: dirDs.setdefault(dirname,listOfDir) else: strDirDS = repr(dirDs) strListOfDir = repr(listOfDir) # strDirDS,strListOfDir = repr(dirDs),repr(listOfDir) dirValue = '{"'+dirname+'":'+strListOfDir +'}' strDirDS = strDirDS.replace("'"+dirname+"'",dirValue) # 替换,还可设置替换次数 dirDs = eval(strDirDS) for file in listOfDir: if os.path.isfile(os.path.join(parentPath,file)): levels.setdefault(file,level+1) print(' '*6+' '*5*level+'|---'+file) #循环遍历输出文件夹中的文件,否则只输出文件夹的名称 listOfSubDirs = [x for x in listOfDir if os.path.isdir(os.path.join(parentPath,x))] if not listOfSubDirs: level-=1 parentPath = os.path.split(parentPath) return for item in listOfSubDirs: traveDir(item,parentPath,level+1) #main function travelPath = 'E:\课件\英语' #要遍历的目录路径 parentPath,Root = os.path.split(travelPath) print(parentPath,'pppppppp') print(Root,'RRRRRRRRRR') level = 0 levels = {} dirDs = {} objsOfDir = [] print('遍历目录:',travelPath) traveDir(Root,parentPath,level) print('生成 目录数据结构dirDS=',dirDs)
生成 目录数据结构dirDS= {'英语': ['sentence.pptx', 'speech-Smile-and-the-world-smiles-with-you.ppt', {'unit one': ['2017 Introduction(1).ppt', '2017 Introduction.ppt']}, {'unit two': ['57793.mp3', '57798.mp3', '57801.mp3', {'sdf': [{'qw': ['新建文本文档.txt']}]}]}]}
树形结果:
windows 的命令行中实现结果:注意参数
python中字典的setdefault()函数与get()函数作用相似;
1. 如果字典中存在该name对应的value 则直接输出value值,否则直接将该键值对加入字典中。
2.global 全局变量
参考文章:http://blog.csdn.net/mldxs/article/details/8559973
3.repr()函数和str()函数的相似,都是返回一个对象的字符串表示,感觉可以这样简单的理解:repr()供解释器读取,str()供人阅读
x = 123
print(repr(x)) #'123'
4.Python中的split()函数和os.path.split()函数区别:
1、split()函数
语法:str.split(str=" ",num=string.count(str))[n]
参数说明:
str: 表示为分隔符,默认为空格,但是不能为空串。若字符串中没有分隔符,则把整个字符串作为列表的一个元素。
num:表示分割次数。如果存在参数num,则仅分隔成 num+1 个子字符串。
[n]: 表示选取第n个分片(从0计数)
str1 = 'wangwangwang'
print(str1.split()) #['wangwangwang']
print(str1.split('w')) #['', 'ang', 'ang', 'ang']
str2 = 'love python' #中间是三个空格
print(str2.split()) #['love', 'python']
print(str2.split(' ')) # ['love', '', '', 'python']
str3 = 'www.bjtu.edu.cn'
print(str3.split('.',0)) #按 . 分割 0 次 ['www.bjtu.edu.cn']
print(str3.split('.',1)) #分割一次 ['www', 'bjtu.edu.cn']
print(str3.split('.',2)[1]) #分割两次,取出索引为1的元素 bjtu
print(str3.split('.',-1)) #尽可能多的分割,-1写与不写没有区别 ['www', 'bjtu', 'edu', 'cn']
s1,s2=str3.split('.',1)
print(s1,s2) #www bitu.edu.cn
str4='''first
python
hello'''
print(str4) # 输出的三个单词各占一行
print(str4.split('\n')) # ['first', 'python', 'hello']
str5='''first
python
hello
'''
print(str4.split('\n')) # ['first', 'python', 'hello', '']
2、os.path.split()函数
语法:os.path.split('PATH')
参数说明:
- PATH指一个文件的全路径作为参数:
- 如果给出的是一个目录和文件名,则输出路径和文件名
- 如果给出的是一个目录名,则输出路径和为空文件名