我在获取列出给定目录中所有目录/子目录的 xml 结构时遇到了困难。我在给定的帖子中使用递归来解决这个问题我的问题比平时更难。我的目录中可能包含 10000 个文件,因此检查每个内容以查看其是否为目录是否成本高昂,并且构建 xml 已经花费了很长时间。我只想为目录构建 xml。
我知道 linux 有一些命令,比如find 。-type d列出存在的目录(不是文件)。我怎样才能在python中实现这一点。
提前致谢。
我在获取列出给定目录中所有目录/子目录的 xml 结构时遇到了困难。我在给定的帖子中使用递归来解决这个问题我的问题比平时更难。我的目录中可能包含 10000 个文件,因此检查每个内容以查看其是否为目录是否成本高昂,并且构建 xml 已经花费了很长时间。我只想为目录构建 xml。
我知道 linux 有一些命令,比如find 。-type d列出存在的目录(不是文件)。我怎样才能在python中实现这一点。
提前致谢。
os.walk
已经区分文件和目录:
def find_all_dirs(root='.'):
for path,dirs,files in os.walk(root):
for d in dirs:
yield os.path.join(path, d)
对于一个目录...
import os
def get_dirs(p):
p = os.path.abspath(p)
return [n for n in os.listdir(p) if os.path.isdir(os.path.join(p, n))]
print "\n".join(get_dirs("."))
这是我在搜索和尝试不同的事情后得到的解决方案。我并不是说这比查找目录中每个内容的方法更快,但它实际上产生的结果要快得多(当目录包含 1000 个文件时差异可见)
import os
import subprocess
from xml.sax.saxutils import quoteattr as xml_quoteattr
def DirAsLessXML(path):
result = '<dir type ={0} name={1} path={2}>\n'.format(xml_quoteattr('dir'),xml_quoteattr(os.path.basename(path)),xml_quoteattr(path))
list = subprocess.Popen(['find', path,'-maxdepth', '1', '-type', 'd'],stdout=subprocess.PIPE, shell=False).communicate()[0]
output_list = list.splitlines()
if len(output_list) == 1:
result = '<dir type ={0} name={1} path={2}>\n'.format(xml_quoteattr('leaf_dir'),xml_quoteattr(os.path.basename(path)),xml_quoteattr(path))
for item in output_list[1:]:
result += '\n'.join(' ' + line for line in DirAsLessXML(item).split('\n'))
result += '</dir>\n'
return result