2016-02-29 6 views
0

Я написал цикл, который игнорирует все подкаталоги, содержащие в них файлы .txt.Python - сопоставить каталоги с шаблоном (регулярное выражение)

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 

Как изменить этот код, чтобы сравнить имя каталога с регулярным выражением в этом случае. (Он должен игнорировать каталоги с файлами .txt)

ответ

0
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)) 

Есть несколько вещей, которые я делал здесь, и надеюсь, что этот пример помогает

  • Я написал это для окон фс так используются два пути преобразования функций ,
  • Этот сценарий игнорирует файлы с .txt-файлами, как вы его реализовали
  • Этот скрипт начнется в каталоге, в котором вы запускаете скрипт, и будет печатать только имена файлов, если шаблон совпадает. Это делается для всех подкаталогов, которые не игнорируются предыдущим правилом.
  • Используется регулярное выражение в питона и сделал это скомпилировать снова для каждого каталога, так что вы получите: «директории/(\ S +) (\ d +) (\ d +) _ (\ d +) __ (\ d +) (\ d +) (\ d +) $»
+0

спасибо я постараюсь реализовать :) –

+0

я обновил весь цикл –

+0

Это еще не работаю, я думаю. Или это? переменная файлов будет пустой, если вкладки не лежат в вставленном скрипте. Вы также не сравниваете каталог или имя файла с шаблоном. – Sand

Смежные вопросы