Python list comprehension返回嵌套列表

时间:2016-05-17 15:36:32

标签: python file list-comprehension os.walk

我构建了这个小程序来模拟我想用文件比较的2个库。

代码是这样的:

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)

3 个答案:

答案 0 :(得分:1)

filename是一个文件列表(您使用的名称不直观),因此预期结果

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 :(得分:1)

如果你想要一个文件名列表,我建议:

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

答案 2 :(得分: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
]