Python 使用循环将文件名与列表匹配已忽略“已”;“已处理”;文件夹

Python 使用循环将文件名与列表匹配已忽略“已”;“已处理”;文件夹,python,Python,我要做的是匹配一组文件,并对我想要的文件进行排序(匹配扩展名),忽略我已经使用列表处理过的其他文件 到目前为止我想到的是 mylist = [] extensions = ['*.txt', '*.foo', '*.bar'] for dirpath, dirnames, filenames in os.walk(directory): skip = None for ext in extensions: for filename in fnmatch.filte

我要做的是匹配一组文件,并对我想要的文件进行排序(匹配扩展名),忽略我已经使用列表处理过的其他文件

到目前为止我想到的是

mylist = []
extensions = ['*.txt', '*.foo', '*.bar']
for dirpath, dirnames, filenames in os.walk(directory):
    skip = None
    for ext in extensions:
        for filename in fnmatch.filter(filenames, ext):
            for test in mylist:
                if test == filename:
                    skip = True
            if not skip:
                ## do my thing
                mylist.append(filename)

但是它忽略了我的if测试语句。我会失明吗?

您正在设置
skip=True
,但从不重置
skip
,因此一旦跳过文件名,其余的也会被跳过。此外,如果文件名不在mylist中,一个简单的
就足够了,不需要执行显式循环

但是,您希望在此处使用
进行快速成员资格测试,并且您可以在任何情况下简化逻辑:

seen = set()
extensions = ['*.txt', '*.foo', '*.bar']
for dirpath, dirnames, filenames in os.walk(directory):
    for ext in extensions:
        for filename in fnmatch.filter(filenames, ext):
            if filename not in seen:
                # do your thing
                seen.add(filename)
接下来,我们可以去掉
fnmatch.filter
选项,使用
.endswith()
将更简单、更快:

seen = set()
extensions = ('.txt', '.foo', '.bar')
for dirpath, dirnames, filenames in os.walk(directory):
    for filename in filenames:
        if filename.endswith(extensions) and filename not in seen:
            # do your thing
            seen.add(filename)
.endswith()
可以获取字符串元组进行查找;在本例中,您的扩展序列

如果您只考虑没有扩展名的文件名,则在测试之前禁止删除扩展名>参见:

extensions = ('.txt', '.foo', '.bar')
for dirpath, dirnames, filenames in os.walk(directory):
    for filename in filenames:
        if filename.endswith(extensions):
            root, ext = os.path.splitext(filename)
            if root in seen:  # we have seen this filename without extension already
                continue

            # do your thing
            seen.add(root)

感谢Martijn非常有用:)我正在测试你发布的东西,很快会将我的发现发回!好的,经过一点修改,我最终得到了这个,pastebin.com/TWKkRS4p,它似乎忽略了if filename.endswith,因为它仍然将列表添加到textfile中,processFile()永远不会得到executed@JoelKåberg:除了
语句之外,我不会使用毯子式的
;它们太容易掩盖你想知道的其他问题。还有更具体的异常可以捕获吗?@JoelKåberg:因为您读取了整个
processedFiles
,所以需要重新写入文件,而不是追加。这不是什么大问题,因为您在读取时使用了一个集合,但运行几次后,文件将包含大量重复项。@JoelKåberg:否则代码在我看来完全正确。我会添加打印语句或使用
pdb
来进一步了解正在发生的事情,并且大多数情况下不会使用blanked
,除了:
处理程序。