我对蟒蛇很陌生,但学习很快。我试图使用regex和os.walk来忽略我不想处理的目录。我知道您必须修改位置上的dir,而不是创建一个新的列表。不过我两种方法都试过了。我没有发现任何错误,但它仍然遍历所有目录。我试图删除所有目录与'EXP‘或'-’或'3.2‘的名称。下面是一个我想忽略3.2.2.150-20150424.195805_EXP_manuMain_outOfMemFix的例子
这就是我所拥有的:
def runtest(filepath_udu: object) -> object:
k = 1
for root, dirs, files in os.walk(filepath_udu, topdown=True):
dirs[:] = [item for item in dirs
if item not in ('1node','local','remote')]
dirs[:] = [dir for dir in dirs
if re.search(r'\bEXP\b', dir) not in dirs \
or re.search(r'\b3.2\b', dir) not in dirs \
or re.search(r'\w+(?:- \w+)+', dir) not in dirs]
for file in files:
do something...我的第二个脏东西被忽视了,我做错了什么?谢谢
发布于 2018-08-03 02:43:34
它不会被忽视,只是你的状况总是真实的,所以你没有过滤掉任何东西。
如果发现了某些内容,re.search将返回一个match对象,如果没有找到,则返回None。不管怎样,这不会是dirs的一个元素,因为dirs只是一个字符串列表。所以你所有的测试都是真的。
与其检查搜索是否在dirs中,不如检查它是否真实。( match对象总是真实的,而None总是falsey。)
而且,在修复之后,我确信您希望保留所有测试失败的值--但是您使用的是or而不是and,这意味着在任何测试失败的地方都保留这些值。
所以:
dirs[:] = [dir for dir in dirs
if not re.search(r'\bEXP\b', dir)
and not re.search(r'\b3.2\b', dir)
and not re.search(r'\w+(?:-\w+)+', dir)]或者,如果反过来更容易理解--而不是在所有测试失败的地方保存所有值,而是将所有值保存在所有测试都不正确的地方:
dirs[:] = [dir for dir in dirs if not (
re.search(r'\bEXP\b', dir) or
re.search(r'\b3.2\b', dir) or
re.search(r'\w+(?:-\w+)+', dir))]发布于 2018-08-03 02:57:23
与使用os.walk不同,您可以避免处理列表操作的开销,方法是在排除符合排除标准的子目录之后,使用os.scandir递归地遍历子目录:
def runtest(filepath_udu: object) -> object:
for entry in os.scandir(filepath_udu):
if entry.is_dir() and entry.name not in ('1node', 'local', 'remote') and not re.search(r'\bEXP\b', entry.name) and not re.search(r'\b3.2\b', entry.name) and not re.search(r'\w+(?:- \w+)+', entry.name):
runtest(entry.path)
else:
do something ...https://stackoverflow.com/questions/51664555
复制相似问题