<div dir="ltr"><div class="gmail_default" style="color:rgb(0,0,0)"><span style="color:rgb(34,34,34)">On Tue, May 8, 2018 at 2:31 AM, Oleg Broytman </span><span dir="ltr" style="color:rgb(34,34,34)"><<a href="mailto:phd@phdru.name" target="_blank">phd@phdru.name</a>></span><span style="color:rgb(34,34,34)"> wrote:</span><br></div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> So anyone who wants to filter os.walk() must reimplement os.walk()<br>
themselves instead of passing something like filter_dir and filter_file<br>
(or accept_dir/accept_file) to os.walk()? Kind of painful, no?<br></blockquote><div><br></div><div class="gmail_default" style="color:rgb(0,0,0)">Not really. It's pretty simple code so you put it in your 'usual suspects' module and just forget about it. Here's our version, maybe 10 years old (reworked last whenever scandir came out):</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default"><span style="font-family:monospace;color:rgb(0,0,0)">def _compiled_patterns(patterns, globs=True, flags=0):</span><br></div><div class="gmail_default"><font color="#000000"><div class="gmail_default"> """ $uuid:95a9b8e2-fb6a-59be-b9c2-da0e6e12f8d3$</div><div class="gmail_default"> Compile a list of patterns into regex patterns. If ``globs``</div><div class="gmail_default"> is true, use ``fnmatch`` to convert the patterns into regular</div><div class="gmail_default"> expressions prior to compilation. ``flags`` is any of the ``re``</div><div class="gmail_default"> module's regular expression flags.</div><div class="gmail_default"> """</div><div class="gmail_default"> if globs:</div><div class="gmail_default"> patterns = list(_fnmatch.translate(glob) for glob in patterns)</div><div class="gmail_default"> return list(_re.compile(regex, flags=flags) for regex in patterns)</div><div class="gmail_default"><br></div><div class="gmail_default">def walk(root_path, ignore_directories=[], show_directories=False):<br></div><div class="gmail_default"> """ $uuid:f77197cd-239b-5d93-9253-c3eb7439d720$</div><div class="gmail_default"> Walk the directory tree and return all the file entries, trimming</div><div class="gmail_default"> directories as we go. ``ignore_directories`` is a list of Unix</div><div class="gmail_default"> file globs.</div><div class="gmail_default"> """</div><div class="gmail_default"> ignore_directories = _compiled_patterns(ignore_directories)</div><div class="gmail_default"><br></div><div class="gmail_default"> def do_walk(top):</div><div class="gmail_default"> """ $uuid:e6a4f789-5b5f-56a2-8551-297c142c3e17$ """</div><div class="gmail_default"> for entry in _scandir.scandir(top):</div><div class="gmail_default"> if not entry.is_dir():</div><div class="gmail_default"> yield entry</div><div class="gmail_default"> elif entry.is_symlink():</div><div class="gmail_default"> pass # Ignore links.</div><div class="gmail_default"> elif not any(ignore.match(<a href="http://entry.name">entry.name</a>) for ignore in ignore_directories):</div><div class="gmail_default"> if show_directories:</div><div class="gmail_default"> yield entry</div><div class="gmail_default"> for entry in do_walk(entry.path):</div><div class="gmail_default"> yield entry</div><div class="gmail_default"><br></div><div class="gmail_default"> return do_walk(root_path)</div></font></div></div></div></div>