2017-01-13 11 views
0

У меня есть несколько каталогов dirs = [dir1, dir2, ...]Объединить выход множественного os.walk работает

Эти каталоги структурированы следующим образом:

dir1 
    subdir1 
    folder1 
    file1 
    file2 
    subdir2 
dir2 
    subdir1 
    folder2 
     file3 
    file4 
    subdir2 

Обратите внимание, что имена подкаталогов являются одинаковыми. Оба dir1 и dir2 имеют одинаковые именованные подкаталоги. Что мне нужно, чтобы напечатать таблицу HTML, которая объединяет файлы и папки из dir1 и dir2, как так:

subdir1 
    folder1 
    folder2 
    file3 
    file1 
    file2 
    file4 
subdir2 

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

До сих пор я создаю дерево для dir1 с помощью os.walk и создаю таблицу html из этой строки, каждая строка которой находится в списке. Затем я делаю os.walk для всех других серверов, и для каждого каталога перейдите в этот список, пока базовое имя не станет таким же, а затем вставьте файлы и папки. Но это очень медленно. Я уверен, что есть очень умное пятилинейное решение, которое достигнет того же.

def get_table(self, teams=['test1', 'test2']): 
    paths = [] 
    table = [] 
    for team in teams: 
     paths.append(config.basepath + '/' + team) 
    for path in paths: 
     if not table: 
      for root, dirs, files in os.walk(path): 
       dirs = sorted(dirs) 
       files = sorted(files) 
       team = self.get_team(path) # extracts the 'dir' from path 
       level = root.replace(path, '').count(os.sep) 
       indent = ' ' * 4 * (level) 
       subindent = ' ' * 4 * (level + 1) 
       table.append('{0}<tr class="{2}"><td>{1}</td><td>{2}</td></tr>'.format(indent, os.path.basename(root), team)) 
       for f in files: 
        table.append('{0}<tr class="{2}"><td>{1}</td><td>{2}</td></tr>'.format(subindent, f, team)) 
     else: 
      for root, dirs, files in os.walk(path): 
       dirs = sorted(dirs) 
       files = sorted(files) 
       team = self.get_team(path) 
       level = root.replace(path, '').count(os.sep) 
       indent = ' ' * 4 * (level) 
       subindent = ' ' * 4 * (level + 1) 
       for idx, line in enumerate(table): 
        if os.path.basename(root) in line: 
         for f in files: 
          table.insert(idx+1, '{0}<tr class="{2}"><td>{1}</td><td>{2}</td></tr>'.format(subindent, f, team)) 

ответ

1

Я бы отделить часть извлечения из реституции части

Extraction :

def process(path, d={}): 
    print('initial', d) 
    for i in os.scandir(path): 
     if i.is_file(): 
      if i.name in d: raise Exception(i.path + 
          "already present") 
      d[i.name] = None 
     elif i.is_dir(): 
      if not i.name in d: d[i.name] = {} 
      process(i.path, d[i.name]) 
    print('final', d) 
    return d 

Дисплей:

def process(path, d={}): 
    print('initial', d) 
    for i in os.scandir(path): 
     if i.is_file(): 
      if i.name in d: raise Exception(i.path + 
          "already present") 
      d[i.name] = None 
     elif i.is_dir(): 
      if not i.name in d: d[i.name] = {} 
      process(i.path, d[i.name]) 
    print('final', d) 
    return d 

С структурой вы предложили, это дает:

>>> process('dir1') 
>>> d = process('dir2') 
>>> print(d) 
{'subdir1': {'folder2': {'file3': None}, 'file1': None, 'file2': None, 'folder1': {}, 'file4': None}, 'subdir2': {}} 
>>> display(d) 
subdir1 
    file1 
    file2 
    file4 
    folder1 
    folder2 
    file3 
subdir2 

Таким образом, вы должны изменить только часть экрана для HTML-форматирования ...

+0

Я думаю, что вы accidentaly выложили функцию процесса дважды, без функции отображения. – mzhaase

0

Я получил его работать с этим, однако, я уверен, что есть лучшее решение:

for path in paths: 
     for root, dirs, files in os.walk(path): 
      dirs = sorted(dirs) 
      files = sorted(files) 
      team = self.get_team(path) 
      level = root.replace(path, '').count(os.sep) 
      indent = ' ' * 4 * (level) 
      subindent = ' ' * 4 * (level + 1) 
      basename = os.path.basename(root) 
      if firstrun: 
       table.append('{0}<tr class="{2}"><td>{1}</td><td>{2}</td></tr>'.format(indent, basename, team)) 
       coretasks[basename] = len(table) - 1 
       for f in files: 
        table.append('{0}<tr class="{2}"><td>{1}</td><td>{2}</td></tr>'.format(subindent, f, team)) 
      else: 
       parsed_folders = [] 
       if basename in coretasks: 
        inserted_files = 0 
        for f in files: 
         table.insert(coretasks[basename] + 1, '{0}<tr class="{2}"><td>{1}</td><td>{2}</td></tr>'.format(subindent, f, team)) 
         inserted_files += 1 
        parsed_folders.append(basename) 
        for coretask in coretasks.keys(): 
         if not coretask in parsed_folders: coretasks[coretask] += inserted_files 
     firstrun = False 
    print('\n'.join(table))