gpt4 book ai didi

python - 使用循环将文件名与列表匹配,忽略已经 "processed"文件

转载 作者:行者123 更新时间:2023-12-01 05:44:42 24 4
gpt4 key购买 nike

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

到目前为止我想到的是

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,因此一旦您跳过了一个文件名,其余的也会被跳过。此外,一个简单的 if filename not in mylist 就足够了,不需要执行显式循环。

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

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() 可以查找一个元组字符串;在本例中是您的扩展序列。

如果您只想考虑不带扩展名的文件名,请在针对 seen 进行测试之前删除扩展名:

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)

关于python - 使用循环将文件名与列表匹配,忽略已经 "processed"文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16478566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com