2016-05-17 88 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 
]