如何在python中使用os.listdir,先按目录排序,然后按文件排序?
我使用os.listdir(),这段代码可以遍历系统目录结构,然后生成一个json文件到easyui call display tree UI的django前端:如何在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
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)
与原始代码一样,无法从创建的数据结构中判断条目是文件名还是空目录