2016-05-17 112 views
1

我構建了這個小程序來模擬我想要比較文件的2個庫。Python列表理解返回嵌套列表

的代碼是這樣的:

import os 

path = "C:\Users\\nelson\Desktop\Lib Check" 

pc_path = os.path.join(path, "pc") 
phone_path = os.path.join(path, "phone") 

pc_lib = [filename for path, dirname, filename in os.walk(pc_path)] 

print pc_lib 

返回

[['1.txt', '2.txt', '3.txt', '4.txt', '5.txt', '6.txt', '8.txt', '9.txt']] 

一切除了事實的結果是在一個嵌套列表罰款。爲什麼?

我能阻止這一切的唯一方法是通過使用

pc_lib = [] 
for path, dirname, filename in os.walk(pc_path): 
    pc_lib.extend(filename) 
+0

只是爲了進一步參考,[在這裏](http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python)是一個整潔的Python列表方式。 – patrick

回答

1

文件名的文件(你已經使用的名稱不直觀)的列表,所以結果預計

for root, dirs, files in os.walk('my/home/directory'): 
    print(files) 
#['close_button.gif', 'close_button_red.gif'], 
#['toolbar.js'] 

extend解開參數list並附加所得到的元件以進行呼叫的list

1

如果你想要的文件名列表,我建議:

[os.path.join(path, filename) 
for path, dirnames, filenames in os.walk(pc_path) 
for filename in filenames] 
+0

這會引發'NameError':'filenames'沒有被定義。 '文件名中的文件名'應該最後一個 –

0

os.walk(path)返回超過(root, dirs, files)元組的迭代器。

  • root是當前相對於os.walk
  • dirs參數的目錄的路徑在當前目錄下的所有子目錄的list
  • files是一切正常的list當前目錄中的文件

如果你想在一個目錄樹中的所有文件的平面列表,使用方法:

pc_lib = [ 
    filename for _, _, files in os.walk(pc_path) 
    for filename in files 
] 

你可能想保留的絕對路徑,以獲得茨艾倫使用:

pc_lib = [ 
    os.path.join(root, filename) 
    for root, _, files in os.walk(pc_path) 
    for filename in files 
]