2015-03-22 2 views
0

Мне нужно сравнить каталоги. Я использую последующий код (пример):Рекурсивные каталоги сравнения Python 3

def dir_comp(dir1, dir2): 
    filecmp.clear_cache() 
    DirComp = filecmp.dircmp(dir1, dir2) 
    if len(DirComp.left_only) > 0: 
     for item in DirComp.left_only: 
      print('File/folder', os.path.join(dir1, item), 'exist only in', dir1) 
    if len(DirComp.right_only) > 0: 
     for item in DirComp.right_only: 
      print('File/folder', os.path.join(dir2, item), 'exist only in', dir2) 
    for CommonDirs in DirComp.common_dirs: 
     new_dir1 = os.path.join(dir1, CommonDirs) 
     new_dir2 = os.path.join(dir2, CommonDirs) 
     dir_comp(new_dir1, new_dir2) 

Но код показать различные файлы только для корневого каталога: http://i.stack.imgur.com/zUf2i.png. Смотрите скриншот с реальным разным между каталогами: http://i.stack.imgur.com/FpQTe.png.

Что не так?

ответ

0
def print_diff_files(dirs): 
    for name in dirs.diff_files: 
     diff_files.append(os.path.join(dirs.left, name)) 
     diff_files.append(os.path.join(dirs.right, name)) 
    for file_left in dirs.left_only: 
     only_left.append(os.path.join(dirs.left, file_left)) 
    for file_right in dirs.right_only: 
     only_right.append(os.path.join(dirs.right, file_right)) 
    for same_files in dirs.same_files: 
     same_files_list.append(os.path.join(dirs.left, same_files)) 
     same_files_list.append(os.path.join(dirs.right, same_files)) 
    for sub_dirs in dirs.subdirs.values(): 
     print_diff_files(sub_dirs) 

DirCompare = filecmp.dircmp('old', 'new') 
print_diff_files(DirCompare) 
0

Это звучит как подкаталоги n5/N51 и n51/N5 присутствуют только в одном месте (нет n5/N5 каталога, ни n51/N51). Сравнение с dircmp не рекурсирует в эти каталоги, поскольку он заранее знает, что каждый файл будет непревзойденным.

Если это не то, что вы хотите, вы должны, вероятно, рассматривать непревзойденные каталоги по-разному от непревзойденных обычных файлов, используя os.walk для проверки их содержимого. Попробуйте что-то вроде этого:

def dir_comp(dir1, dir2): 
    filecmp.clear_cache() 
    DirComp = filecmp.dircmp(dir1, dir2) 
    for item in DirComp.left_only: 
     path = os.path.join(dir1, item) 
     if os.path.isdir(path): 
      for base, subdirs, files in os.walk(path): 
       print("Folder", base, "exists only in", dir1) 
       for file in files: 
        print("File", os.path.join(base, file), "exists only in", dir1) 
     else: 
      print('File', path, 'exist only in', dir1) 

    for item in DirComp.right_only: 
     path = os.path.join(dir2, item) 
     if os.path.isdir(path): 
      for base, subdirs, files in os.walk(path): 
       print("Folder", base, "exists only in", dir2) 
       for file in files: 
        print("File", os.path.join(base, file), "exists only in", dir2) 
     else: 
      print('File', os.path.join(path), 'exist only in', dir2) 

    for CommonDirs in DirComp.common_dirs: 
     new_dir1 = os.path.join(dir1, CommonDirs) 
     new_dir2 = os.path.join(dir2, CommonDirs) 
     dir_comp(new_dir1, new_dir2) 

Это должно напечатать все файлы, которые существуют только в одной папке (даже если они находятся в каталоге, который существует только в том, что один). Обратите внимание, что объект DirComp, который вы получаете, уже имеет информацию, необходимую для вашей рекурсии, на CommonDirs. Проверьте его атрибут subdirs. Вы можете реорганизовать свой код, чтобы вы только один раз вызывали filecmp.dircmp, а затем передавали результаты в рекурсивную функцию для их распечатки.

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