2012-06-07 2 views
3

Это код, который я использовал. Почему can not os ходить ручкой?Os.walk не работает с каталогом, соответствующим регулярному выражению

import os, re 

cwd = os.getcwd() 
directory= 'Box II' 
dirpattern = re.compile(r'^.*?\\'+directory+'.*?', re.M) 

for root, dirs, files in os.walk(os.path.abspath(cwd)): 
    if dirpattern.search(root): 
     match = dirpattern.search(root) 
     match=match.group(0) 

print match #OUTPUT = D:\dir1\dir2\dir3 (the directory i searched for) 

for root, dirs, files in os.walk(os.path.abspath(match)): 
    print files #OUTPUT = nothing 

Почему я не могу использовать соответствующую папку для новой петли os.walk?

+1

Отличается ли это от вашего [более раннего вопроса] (http://stackoverflow.com/questions/10934199/os-walk-wont-work-with-directory-acquired-through-match-group0-encodestrin)? – DSM

+1

Вы исходите из фона perl? Вам нравится самонарезать боль? – KurzedMetal

+0

Эй, DSM, да, в том смысле, что я не манипулировал match = match.group (0) im, используя его как есть с os.walk. Здравствуйте, KurzedMetal, да, действительно, я получаю форму perl backround, как вы разобрались с ge regexes? – Baf

ответ

2

Я думаю, вы хотите использовать генератор для каждого матча, чтобы вы могли ходить по вещам, которые соответствуют вашему выражению. Вот фрагмент кода, который я использую регулярно.

import os, fnmatch 

# 
# This wrapper for os.walk is based on Python Cookbook, 2.16. 
# Added the exclude_dirs named parameter so that we can skip svn folders. 
# Added the yield_files named parameter so that we can return only folders. 
# 

def walk_file_system (root, patterns='*', single_level=False, yield_folders=False, yield_files=True, exclude_dirs='.svn'): 
    # Expand patterns from semicolon-separated string to list 
    patterns = patterns.split (';') 
    exclude_dirs = exclude_dirs.split (';') 
    for path, subdirs, files in os.walk (root): 
     for exclude_dir in exclude_dirs: 
      for dir in subdirs: 
       if fnmatch.fnmatch (dir, exclude_dir): 
        subdirs.remove(dir) 
     fsnodes = [] 
     if yield_folders: 
      fsnodes.extend(subdirs) 
     if yield_files: 
      fsnodes.extend(files) 
     fsnodes.sort () 
     for name in fsnodes: 
      for pattern in patterns: 
       if fnmatch.fnmatch (name, pattern): 
        yield os.path.join (path, name) 
        break 
     if single_level: 
      break 

Вы можете использовать его следующим образом.

def walk_file_system_test(): 
    #patterns='*', single_level=False, yield_folders=False, yield_files=True, exclude_dirs='.svn'): 
    print "Walk current directory with function defaults." 
    for fsnode in walk_file_system(os.getcwd()): 
     print fsnode 

    #patterns='*', single_level=False, yield_folders=True, yield_files=True, exclude_dirs='.svn'): 
    print "Walk current directory with yield_folders=True." 
    for fsnode in walk_file_system(os.getcwd(), yield_folders=True): 
     print fsnode 

    #patterns='*', single_level=False, yield_folders=True, yield_files=False, exclude_dirs='.svn'): 
    print "Walk current directory with yield_folders=True, yield_files=False." 
    for fsnode in walk_file_system(os.getcwd(), yield_folders=True, yield_files=False): 
     print fsnode 

    #patterns='*', single_level=False, yield_folders=True, yield_files=False, exclude_dirs='.svn'): 
    print "Walk current directory with yield_folders=True, yield_files=False, exclude_dirs='.svn;temp'." 
    for fsnode in walk_file_system(os.getcwd(), yield_folders=True, yield_files=False, exclude_dirs='.svn;temp'): 
     print fsnode 

Надеюсь, это поможет. Для вас должно быть достаточно просто заменить fnmatch на re.

+0

Эй, ChipJust, Thx много для кода u. Попытка понять его и проверить его прямо сейчас Если вы не возражаете, если у вас нет вопросов. – Baf

+0

Эй, у меня не было времени, чтобы тщательно проверить код, это похоже на шарм! Это определенно способ пойти, THX для этого. понять, почему мой код не работает :(! – Baf