如何在python中使用os.listdir,先按目录排序,然后按文件排序?

如何在python中使用os.listdir,先按目录排序,然后按文件排序?,python,Python,我使用os.listdir(),这段代码可以遍历系统目录结构,然后生成一个json文件到easyui call display tree UI的django前端: def CreateDirTree(path,file_json): global id_num id_num=0 def createDict(path): global id_num tree_list=[] pathList = os

我使用os.listdir(),这段代码可以遍历系统目录结构,然后生成一个json文件到easyui call display tree UI的django前端:

def CreateDirTree(path,file_json):
    global id_num
    id_num=0
    def createDict(path):
            global id_num
            tree_list=[]
            pathList = os.listdir(path)
            for i,item in enumerate(pathList):
                    id_num+=1
                    children_map={}
                    children_map['id']=id_num
                    children_map['text']=item
                    if os.path.isdir(os.path.join(path,item)):
                            path = os.path.join(path,item)
                            print "directory:",path
                            tmp_listdir=os.listdir(path)
                            if  len(tmp_listdir) != 0:
                                    children_map['state']='closed'
                                    children_map['children'] = createDict(path)
                            tree_list.append(children_map)
                            path = '\\'.join(path.split('\\')[:-1])
                    else:
                        tree_list.append(children_map)
                        print children_map
            return tree_list

    tree_list=createDict(path)
    fjson = json.dumps(tree_list,ensure_ascii=False,sort_keys=False)
    with open(file_json,'w') as lf:
            lf.write(fjson)
    ##end
CreateDirTree("D:\\all_source\\somesite","123.json")
运行,结果为:

directory: D:\all_source\somesite\a

file is: b.txt

file is: oo.txt

file is: a.txt

directory: D:\all_source\somesite\b

file is: 123.txt

file is: b.txt
directory: D:\all_source\somesite\c

file is: yyt.txt

directory: D:\all_source\somesite\c\z

file is: c.txt

file is: e.txt
directory: D:\all_source\somesite\a

a subdir files: 123.txt

a subdir files: abc.txt

directory: D:\all_source\somesite\b

directory: D:\all_source\somesite\c

directory: D:\all_source\somesite\c\z

file is: a.txt

file is: b.txt

file is: c.txt

file is: e.txt
但我想说的是:

directory: D:\all_source\somesite\a

file is: b.txt

file is: oo.txt

file is: a.txt

directory: D:\all_source\somesite\b

file is: 123.txt

file is: b.txt
directory: D:\all_source\somesite\c

file is: yyt.txt

directory: D:\all_source\somesite\c\z

file is: c.txt

file is: e.txt
directory: D:\all_source\somesite\a

a subdir files: 123.txt

a subdir files: abc.txt

directory: D:\all_source\somesite\b

directory: D:\all_source\somesite\c

directory: D:\all_source\somesite\c\z

file is: a.txt

file is: b.txt

file is: c.txt

file is: e.txt

先按目录排序,然后按文件排序,怎么办?请帮帮我,谢谢

为目录和另一个目录创建一个列表,并遍历它们的连接。根据您的代码进行调整:

(...)
# List of directories only
dirlist = [x for x in os.listdir(path) if os.path.isdir(os.path.join(path, x))]
# List of files only
filelist = [x for x in os.listdir(path) if not os.path.isdir(os.path.join(path, x))]
for i,item in enumerate(dir_list + filelist):
(...)

这将从目录及其子目录开始,然后移动到文件

创建目录列表和文件列表,并迭代它们的连接。根据您的代码进行调整:

(...)
# List of directories only
dirlist = [x for x in os.listdir(path) if os.path.isdir(os.path.join(path, x))]
# List of files only
filelist = [x for x in os.listdir(path) if not os.path.isdir(os.path.join(path, x))]
for i,item in enumerate(dir_list + filelist):
(...)

这将从目录及其子目录开始,然后移动到文件

这里有一个函数,用于创建结构,无需使用
全局
变量,也无需为每个目录调用两次
os.listdir()

import os
from itertools import count


def create_dir_tree(path):
    ids = count(0)
    def recurse(path):
        names = list()
        for name in os.listdir(path):
            full_name = os.path.join(path, name)
            names.append((os.path.isdir(full_name), name, full_name))
        names.sort(key=lambda n: (not n[0], n[1]))
        result = list()
        for is_dir, name, full_name in names:
            item = {'id': next(ids), 'text': name}
            if is_dir:
                children = recurse(full_name)
                if children:
                    item['state'] = 'closed'
                    item['children'] = children
            result.append(item)
        return result
    return recurse(path)

与原始代码一样,无法从创建的数据结构中判断条目是文件名还是空目录。

这里有一个函数,用于创建结构,而不使用
全局变量,也不需要为每个目录调用
os.listdir()

import os
from itertools import count


def create_dir_tree(path):
    ids = count(0)
    def recurse(path):
        names = list()
        for name in os.listdir(path):
            full_name = os.path.join(path, name)
            names.append((os.path.isdir(full_name), name, full_name))
        names.sort(key=lambda n: (not n[0], n[1]))
        result = list()
        for is_dir, name, full_name in names:
            item = {'id': next(ids), 'text': name}
            if is_dir:
                children = recurse(full_name)
                if children:
                    item['state'] = 'closed'
                    item['children'] = children
            result.append(item)
        return result
    return recurse(path)
与原始代码一样,无法从创建的数据结构中判断条目是文件名还是空目录