2010-11-04 57 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

相關問題