简体   繁体   中英

Get also elements that don't match fnmatch

I'm using a recursive glob to find and copy files from a drive to another

def recursive_glob(treeroot, pattern):
   results = []
   for base, dirs, files in os.walk(treeroot):

      goodfiles = fnmatch.filter(files, pattern)
      results.extend(os.path.join(base, f) for f in goodfiles)

return results

Works fine. But I also want to have access to the elements that don't match the filter.

Can someone offer some help? I could build a regex within the loop, but there must be a simpler solution, right?

If order doesn't matter, use a set:

goodfiles = fnmatch.filter(files, pattern)
badfiles = set(files).difference(goodfiles)

Another loop inside the os.walk loop can also be used:

goodfiles = []
badfiles = []
for f in files:
  if fnmatch.fnmatch(f, pattern):
    goodfiles.append(f)
  else:
    badfiles.append(f)

Note: With this solution you have to iterate through the list of files just once. In fact, the os.path.join part can be moved to the loop above.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM