在我的代码中,我将整个文件夹加载到列表中,然后尝试除去.mp3文件之外的列表中的每个文件。
import os
import re
path = '/home/user/mp3/'
dirList = os.listdir(path)
dirList.sort()
i = 0
for names in dirList:
match = re.search(r'\.mp3', names)
if match:
i = i+1
else:
dirList.remove(names)
print dirList
print i
运行文件之后,代码确实摆脱了列表中的一些文件,但特别保留了这两个文件:
[' 00。各种艺术家 - 独立摇滚播放列表2008年10月.m3u',' 00。各种艺术家 - 独立摇滚播放列表2008年10月.pls']
我无法理解发生了什么,为什么这两个人专门逃避我的搜索。
答案 0 :(得分:4)
您正在循环中修改列表。这可能会导致问题。您应该循环遍历列表的副本(for name in dirList[:]:
),或创建新列表。
modifiedDirList = []
for name in dirList:
match = re.search(r'\.mp3', name)
if match:
i += 1
modifiedDirList.append(name)
print modifiedDirList
甚至更好,使用列表理解:
dirList = [name for name in sorted(os.listdir(path))
if re.search(r'\.mp3', name)]
同样的事情,没有正则表达式:
dirList = [name for name in sorted(os.listdir(path))
if name.endswith('.mp3')]
答案 1 :(得分:3)
也许你应该使用glob模块 - 这是你的整个脚本:
>>> import glob
>>> mp3s = sorted(glob.glob('*.mp3'))
>>> print mp3s
>>> print len(mp3s)
答案 2 :(得分:2)
一旦调用dirList.remove(names)
,原始迭代器就无法执行您想要的操作。如果迭代列表的副本,它将按预期工作:
for names in dirList[:]:
....
或者,您可以使用list comprehensions构建正确的列表:
dirList = [name for name in dirList if re.search(r'\.mp3', name)]