Рекурсивный код для обхода каталогов в python и фильтрации файлов - PullRequest
0 голосов
/ 30 августа 2018

Я бы хотел рекурсивно искать в каталогах "project" папку "Feedback Report", и если в этой папке больше нет подкаталогов, я бы хотел обработать файлы определенным образом.

После того, как мы достигли целевого каталога, я хочу найти последний отчет report.xlsx в этом каталоге (который будет содержать много предыдущих версий)

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

Путь к файлу важен.

Мой алгоритм, который я хотел бы реализовать:

dictionary_of_files_paths = {}
def recursive_traverse(path):

    //not sure if this is a right base case
    if(path.isdir):    
        if re.match(dir_name, *eedback*port*) and dir has no sub directory:
          process(path,files)
          return

    for contents in os.listdir(path):
        recursive_traverse(os.path.join(path, contents)) 

    return

def process(path,files):

    files.filter(filter files only with xlsx)
    files.filter(filter files only that have *eedback*port* in it)
    files.filter(os.path.getmtime > 2016)
    files.sort(key=lambda x:os.path.getmtime(x))
    reversed(files)
    dictionary_of_files_paths[path] = files[0]

recursive_traverse("T:\\Something\\Something\\Projects")

Мне нужно руководство, прежде чем я на самом деле реализую, и мне нужно проверить, правильно ли это.

Есть еще один фрагмент, который я получил для иерархии путей от stackoverflow, который

try:
    for contents in os.listdir(path):
        recursive_traverse(os.path.join(path, contents)) 
except OSError as e:
    if e.errno != errno.ENOTDIR:
        raise
    //file

1 Ответ

0 голосов
/ 30 августа 2018

Используйте pathlib и glob.

Тестовая структура каталогов:

.
├── Untitled.ipynb
├── bar
│   └── foo
│       └── file2.txt
└── foo
    ├── bar
    │   └── file3.txt
    ├── foo
    │   └── file1.txt
    └── test4.txt

Код:

from pathlib import Path
here = Path('.')
for subpath in here.glob('**/foo/'):
    if any(child.is_dir() for child in subpath.iterdir()):
        continue # Skip the current path if it has child directories
    for file in subpath.iterdir():
        print(file.name)
        # process your files here according to whatever logic you need

Выход:

file1.txt
file2.txt
...