Python切片操作过滤文件夹

我正在使用os.walk()过滤目录组件:

exclude_dirs = ['a', 'b']
for root, dirs, files in os.walk(mytopdir):
  dirs[:] = [d for d in dirs if d not in exclude_dirs]  # 1. Works
  dirs = [d for d in dirs if d not in exclude_dirs]     # 2. Doesn't work
复制代码

似乎第二个变量正在制作一个新的局部变量,该变量隐藏了原始目录.第一个如何避免这种情况发生?

最佳答案

dirs [:] = …就地修改dirs.
dirs = … reassigns the variable指向新对象.仅当dirs最初引用的对象被就地修改时,os.walk访问的目录才会受到影响.

dirs [:] = …是slice assignment的形式.

In [18]: dirs = range(10)

In [19]: dirs
Out[19]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [20]: id(dirs)
Out[20]: 158391724
复制代码

此分片分配将dirs [5:8]中的值替换为’hello’中的字符.请注意,切片(3)中的项目数不必等于分配(5)中的项目数.

In [21]: dirs[5:8] = 'hello'

In [22]: dirs
Out[22]: [0, 1, 2, 3, 4, 'h', 'e', 'l', 'l', 'o', 8, 9]
复制代码

ID不变:

In [23]: id(dirs)
Out[23]: 158391724
复制代码

当省略开始和停止切片索引时,该切片被视为整个列表:

In [24]: dirs[:] = 'cheese'

In [25]: dirs
Out[25]: ['c', 'h', 'e', 'e', 's', 'e']
复制代码

请注意,ID再次保持不变.这表明dirs指向同一对象,并且修改已就地完成.

In [26]: id(dirs)
Out[26]: 158391724
复制代码

相反,如果您将dirs重新分配给其他值,则id会更改,因为它现在指向另一个对象.

In [27]: dirs = 'spam'

In [28]: id(dirs)
Out[28]: 181415008

注意点:

"""下面此方法也能达到上面列表推导式的效果"""

# if 'XXX' in dirs:

# dirs.remove('XXX')

但是次方法效率没有切片高,但是适用于初级接触python的人,比较容易理解 

猜你喜欢

转载自blog.csdn.net/box_kun/article/details/108823147