2010-11-04 28 views
0

索里,如果我的英语不好...
我试图让我的目录清单是这样的:为什么我的os.listdir返回相同的文件夹?

import os, os.path 

_path = "/opt/local"#this because i use mac 
_dir_path = os.listdir(_path) 
_tmp_attr = {"name":"","type":""} 
_tmp_data =[] 

for _dir_name in _dir_path: 
    _tmp_attr["name"] = _dir_name 
    if os.path.isdir(_path+'/'+_dir_name): 
    _tmp_attr["type"] = "Dictionary" 
    _tmp_data.append(_tmp_attr) 
print _tmp_data 

,但只打印最后一个目录
[{“类型”:“ '','name':'www'},{'type':'Dictionary','name':'www'},...]

回答

1

您正在重新使用相同的“_tmp_attr”字典在每一次循环迭代中,所以你只是重新添加同一个实例到_tmp_data集合并在每次迭代中覆盖它的内容。

需要初始化一个新的字典在每次迭代:

_tmp_attr = { } 
+0

但我认为5号线:_tmp_attr = {“名”:“”,“类型”:“” }无用 – 2010-11-04 06:22:06

+0

但是谢谢..... – 2010-11-04 06:22:28

1

你这里有什么是对象引用的问题。您添加到列表中的_tmp_attr实际上是同一个对象。循环的每个迭代只是更新它。您需要为每个迭代按顺序创建一个新的_tmp_attr对象,以使列表元素唯一。当循环遍历你时,只是在列表中留下了多个引用到同一个对象。 在循环这样做可能会有所帮助:

type = "" 
if os.path.isdir(os.path.join(_path,_dir_name)): 
    type = "Dictionary" 
_tmp_data.append({"type":type,"name":_dir_name}) 
1

,你可能也想看看os.walk

+0

'os.path.walk'已弃用。 – aaronasterling 2010-11-04 07:00:58

+0

@aaron好点。它远比os.walk更笨拙 – 2010-11-04 20:06:38

相关问题