参考了一下其他大佬的,自己又完善了一点。
显示指定路径的目录文件树。
import os
from os.path import join, getsize
import re
def tryint(s): #将元素中的数字转换为int后再排序
try:
return int(s)
except ValueError:
return s
def str2int(v_str): #将元素中的字符串和数字分割开
return [tryint(sub_str) for sub_str in re.split('([0-9]+)', v_str)]
def sort_humanly(v_list): #以分割后的list为单位进行排序 人为排序
return sorted(v_list, key=str2int) #第一个参数是列表,第二个参数是函数(按照什么来排序)
def getdirsize(dir):
size = 0
for root, dirs, files in os.walk(dir): #root路径、dirs文件夹目录列表、files文件目录列表
size += sum([getsize(join(root, name)) for name in files])
return size
def traverse_dir(current_dir, deep=0):
"""
current_dir: 绝对路径: "./" 或当前路径: 'D:/picture'
"""
dir_list = os.listdir(current_dir)
# traverse folder first.
path_list, file_list = [], []
for dir in dir_list:
path = os.path.join(current_dir, dir) #拼接
if os.path.isdir(path): #判断 如果是文件夹的话
path_list.append(dir)
else:#如果是文件,添加到文件列表
file_list.append(dir)
path_list=sort_humanly(path_list)
dir_list = file_list + path_list
# traverse all dir.
for dir in dir_list: #遍历
path = os.path.join(current_dir, dir)
if os.path.isdir(path): #如果是文件夹的话
# do something to this directory
if getdirsize(path)/1024/1024/1024>=1 : #GB
print("\t" * deep, dir,"\t",round(getdirsize(path)/1024/1024/1024,2),"GB")
if getdirsize(path)/1024/1024>=1 and getdirsize(path)/1024/1024/1024<1 : #MB
print("\t" * deep, dir,"\t",round(getdirsize(path)/1024/1024,2),"MB")
if getdirsize(path)/1024>=1 and getdirsize(path)/1024/1024<1 : #KB
print("\t" * deep, dir,"\t",round(getdirsize(path)/1024,2),"KB")
if getdirsize(path) / 1024 < 1: #B
print("\t" * deep, dir, "\t", round(getdirsize(path), 2), "B")
traverse_dir(path, deep + 1) #递归
if os.path.isfile(path): #如果是文件的话
# do something to this file
if getsize(path)/1024/1024/1024>=1: #GB
print("\t" * deep, "|--", dir,"\t",round(getsize(path)/1024/1024/1024,2),"GB")#列出具体文件
if getsize(path)/1024/1024>=1 and getsize(path)/1024/1024/1024<1: #MB
print("\t" * deep, "|--", dir,"\t",round(getsize(path)/1024/1024,2),"MB")#列出具体文件
if getsize(path)/1024>=1 and getsize(path)/1024/1024<1: #GB
print("\t" * deep, "|--", dir,"\t",round(getsize(path)/1024,2),"KB")#列出具体文件
if getsize(path)/1024<1: #B
print("\t" * deep, "|--", dir,"\t",round(getsize(path),2),"B")#列出具体文件
path=str(input("请输入指定路径: "))
traverse_dir(path)