简体   繁体   中英

Python - match directories with pattern (regular expression)

I wrote a loop which ignores all sub-directories which contain .txt files within them.

src = raw_input("Enter source disk location: ")
src = os.path.abspath(src)
dst = raw_input("Enter first destination to copy: ")
dst = os.path.abspath(dst)
dest = raw_input("Enter second destination to move : ")
dest = os.path.abspath(dest) 

path_patter = '(\S+)_(\d+)_(\d+)_(\d+)__(\d+)_(\d+)_(\d+)'

for dir, dirs, files in os.walk(src):
if any(f.endswith('.txt') for f in files):
    dirs[:] = []  # do not recurse into subdirectories
    continue  
files = [os.path.join(dir, f) for f in files ]

for f in files:

    part1 = os.path.dirname(f)
    part2 = os.path.dirname(os.path.dirname(part1))
    part3 = os.path.split(part1)[1]
    path_miss1 = os.path.join(dst, "missing_txt")
    path_miss = os.path.join(path_miss1, part3)
    path_missing = os.path.join(dest, "missing_txt")
    searchFileName = re.search(path_patter, part3)#### update

    if searchFileName:#####update
    try:
        if not os.path.exists(path_miss):
            os.makedirs(path_miss)
        else:
            pass

        if os.path.exists(path_miss):
            distutils.dir_util.copy_tree(part1, path_miss)
        else:
            debug_status += "missing_file\n"
            pass

        if (get_size(path_miss)) == 0:
            os.rmdir(path_miss)
        else:
            pass

        if not os.path.exists(path_missing):
            os.makedirs(path_missing)
        else:
            pass

        if os.path.exists(path_missing):
            shutil.move(part1, path_missing)
        else:
            pass

        if (get_size(path_missing)) == 0:
            os.rmdir(path_missing)
        else:
            pass
    except Exception:
        pass
    else:
    continue

How to modify this code to compare directory name with regular expression in this case. (it has to ignore directories with .txt files)

import os
import re

def createEscapedPattern(path,pattern):
    newPath = os.path.normpath(path)
    newPath = newPath.replace("\\","\\\\\\\\")
    return newPath + "\\\\\\\\" +  pattern

def createEscapedPath(path):
    newPath =  os.path.normpath(path)
    return newPath.replace("\\","\\\\")

src = 'C:\\Home\\test'
path_patter = '(\S+)_(\d+)_(\d+)_(\d+)__(\d+)_(\d+)_(\d+)$'
p = re.compile(createEscapedPattern(src,path_patter))
for dir, dirs, files in os.walk(src):
    if any(f.endswith('.txt') for f in files):
        dirs[:] = []
        continue
    if any(p.match(createEscapedPath(dir)) for f in files):
        for f in files:
            print createEscapedPath(dir + "/" + f)
    p = re.compile(createEscapedPattern(dir,path_patter))

There are a couple of things i did here and hope this example helps

  • I wrote this for windows fs so used two path convert functions.
  • This script ignores dirs with .txt files like you implemented it
  • This script will start at the directory you start the script and will only print file names if the pattern matches. This is done for all subdirectory's that are not ignored by the previous rule.
  • Used regex in python and made it compile again for each directory so you get: 'directory/(\\S+) (\\d+) (\\d+)_(\\d+)__(\\d+) (\\d+) (\\d+)$'

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