Я хотел бы рекурсивно искать в каталогах «проект» папку «Отчет обратной связи», и если в этой папке больше нет подкаталогов, я хотел бы обработать файлы определенным образом.
После того, как мы достигли целевого каталога, я хочу найти последний отчет обратной связи 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
Используйте 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