Я рекомендую использовать вложенные дикты для кэширования ваших пар alertfile
и eventfile
.Поскольку папка может содержать или не содержать пары файлов, в этом случае она должна использовать клавишу '.'
для хранения указания файловых пар в этой папке, например:
cache = {
'.': {'alertfile': 'alert content', 'eventfile': 'event content'},
'hello': {
'foo': {'.': {'alertfile': 'alert content', 'eventfile': 'event content'}},
'bar': {'.': {'alertfile': 'alert content', 'eventfile': 'event content'}}
},
'world': {
'aloha': {
'.': {'alertfile': 'alert content', 'eventfile': 'event content'},
'hi': {'.': {'alertfile': 'alert content', 'eventfile': 'event content'}},
'hey': {'.': {'alertfile': 'alert content', 'eventfile': 'event content'}}
}
},
'empty': {}
}
И здесьявляется рекурсивной функцией, которая сканирует заданный каталог, читает любую из пар файлов внутри и возвращает dict в приведенной выше структуре данных.
from os import listdir
from os.path import isdir, join
def scan_files(dir):
cache = {}
for name in listdir(dir):
path = join(dir, name)
if isdir(path):
cache[name] = scan_files(path)
elif name in ('alertfile', 'eventfile'):
with open(path, 'r') as file:
cache['.'][name] = file.read()
return cache
Вы можете поместить блок внутри цикла for
выше впул потоков, если вы хотите ускорить процесс.
Или, если вы предпочитаете кэшировать файлы в едином формате, вы можете использовать os.walk
вместо того, чтобы обойти весь каталогв цикле.
import os
def scan_files(dir):
cache = {}
for root, dirs, files in os.walk(dir):
for name in files:
if name in ('alertfile', 'eventfile'):
path = os.path.join(root, name)
with open(path, 'r') as file:
cache[path] = file.read()
return cache