我正在面临难以获得列出给定目录内所有目录/子目录的xml结构。我在given post中使用递归工作,我的问题比平常更加困难。我有可能有10000个文件的目录,因此检查每个内容以查看它的目录是否会很昂贵,并且它已经花费很长时间来构建xml。我只想为目录构建xml。获取给定目录内的子目录列表
我知道linux有一些命令,比如找不到。 -type d列出存在的目录(不是文件)。我如何在Python中实现这一点。
在此先感谢。
我正在面临难以获得列出给定目录内所有目录/子目录的xml结构。我在given post中使用递归工作,我的问题比平常更加困难。我有可能有10000个文件的目录,因此检查每个内容以查看它的目录是否会很昂贵,并且它已经花费很长时间来构建xml。我只想为目录构建xml。获取给定目录内的子目录列表
我知道linux有一些命令,比如找不到。 -type d列出存在的目录(不是文件)。我如何在Python中实现这一点。
在此先感谢。
这里是我搜索并尝试不同的东西后得到了解决。我不是说这个,如果不是则看目录中的每一个内容的方法更快,但它实际上产生的结果更加快捷(差值时可见目录包含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
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("."))
@ spiralx-no赞成使用os.path.isdir,不想检查每个内容以查看它的目录或不是目录包含10000个文件 –
那么这就像你将要使用标准库一样快,我认为,没有命令来获取目录 - 它将如何工作?你可以使用'subprocess'模块来执行一个二进制文件,但我不知道它是否会更快。 – spiralx
@ phihagos.walk本身复发。我正在避免这种情况,因为我必须在给定的目录中创建一个xml的子目录 –
对不起,“recurs itself”是什么意思?如果您只创建一个*文件*,那么它不应该影响*目录树*。但即使你创建了一个目录,你也可以将整个树存储在一个变量中,其中包含dirs = list(find_all_dirs()),然后在该列表上进行操作。 – phihag
@ phihag - 我试图通过递归本身来构建XML。是的,我可以将整个树存储在一个变量中,并创建一个xml, –