简体   繁体   English

Python-使用模式匹配目录(正则表达式)

[英]Python - match directories with pattern (regular expression)

I wrote a loop which ignores all sub-directories which contain .txt files within them. 我写了一个循环,忽略了其中包含.txt文件的所有子目录。

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) (它必须忽略带有.txt文件的目录)

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. 我为Windows fs编写了此代码,因此使用了两个路径转换功能。
  • This script ignores dirs with .txt files like you implemented it 该脚本会像您实现它一样忽略带有.txt文件的目录
  • 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+)$' 在python中使用了正则表达式,并使其针对每个目录再次进行编译,因此您得到:'directory /(\\ S +) (\\ d +) (\\ d +)_(\\ d +)__(\\ d +) (\\ d +) (\\ d +)$ '

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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