У меня сетевой диск содержит различные каталоги и папки. На этом diks в Z: / main / у меня есть интересные мне dirs с: "DATA-" в названии. В этих папках снова различные каталоги и файлы. В этих папках у меня должны быть (что-то, чего у меня нет) журналы регистрации. И в этих логах есть .csv или .txt файлы с рапортами. Еще одна кодировка - logs dir в названии содержит год ex: 2017XXxxLog. Мне нужны только журналы 2018 +.
Так что я создаю этот простой скрипт, используя walk:
import os
path = Z/main/:
def findAllOutDirs(path):
finalPathList = []
for root, subdirs, files in os.walk(path):
for d in subdirs:
if d == "log" or d == "LOG":
outPath = root+r"\{}".format(d)
if ("DATA" in outPath) and ("2018" in outPath or "2019" in outPath or "2020" in outPath):
finalPathList.append(outPath)
return finalPathList
dirsList = findAllOutDirs(w_path)
files = []
# r=root, d=directories, f = files
for i in dirsList:
for r, d, f in os.walk(i):
for file in f:
pathToCsv = os.path.join(r, file)
if ('.txt' in pathToCsv) or ('.csv' in pathToCsv) or ('.CSV' in pathToCsv):
#print(pathToCsv)
files.append(pathToCsv)
Так, как U может видеть, первая функция смотрит * log 100 * или LOG
dirs, и если в пути значение 2018|2019|2020
, то путь добавляется в список. И теперь у меня есть пути ко всем интересным каталогам.
Далее я снова использовал прогулку и получил список для поиска файлов CSV или txt. Поэтому я получил только файлы из
DATA*/2018|2019|2020*/log|LOG/*.csv|*.txt.
По крайней мере, у меня есть правильный список, но это занимает много времени. Кто-то здесь посоветовал мне использовать faster_than_walk library
, поэтому я попытался сделать это, но я не могу построить правильный путь:
new_list = ftw.walk_glob("Z/main/*Data*/*2018*/log/*.csv)
- и я получил правильный результат только для 2018 и * .csv, поэтому я нужно повторять несколько раз одну и ту же инструкцию с разными параметрами. Это можно сделать за одну инструкцию?
Или, может быть, это лучший способ, чем мой? Мне действительно нужно оптимизировать этот поиск.