/
VolcanoByte
/
vbBooks
Обзор
Документация
Войти
/
VolcanoByte
/
vbBooks
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
experiments/DataExtract/elemExtract.py
66 строк
2 KB
Eugene Gavrilyuk
test: Эксперименты
04 авг 2025, 16:55
04 авг 2025, 16:55
ba9f4aa
Код
Авторство
О чём код?
""" Перебор элементов в файлах FB2 в указанной папке. Считается количество максимальное одинаковых элементов в файле и последний файл, в котором был такой элемент. """ import xml.etree.ElementTree as ET import os import sys from tqdm import tqdm HEADER = '{http://www.gribuser.ru/xml/fictionbook/2.0}' tags = dict() tagCount = dict() def addRec(root: str, elem, filename: str, _count: dict): """Рекурсивный обход элементов""" if HEADER in elem.tag: tag = elem.tag[len(HEADER):] if elem.text and len(elem.text) > 0 or len(elem.attrib) > 0: if root: _key = root + '/' + tag else: _key = tag tags[_key] = filename if _key in _count: _count[_key] = _count[_key] + 1 else: _count[_key] = 1 elif len(elem) > 0: for child in elem: if root: addRec(root + '/' + tag, child, filename, _count) else: addRec(tag, child, filename, _count) def getBookInfo(filename: str): """Начинаем обходить все элементы в title-info""" tree = ET.parse(filename) root = tree.getroot() desc = root.find('.//' + HEADER + 'title-info') _count = dict() for child in desc: addRec('', child, filename, _count) for _key in _count.keys(): if _key not in tagCount or tagCount[_key] < _count[_key]: tagCount[_key] = _count[_key] def processFolder(folder: str): """Обходим все файлы в папке""" files = os.listdir(folder) for filename in tqdm(files): getBookInfo(os.path.join(folder, filename)) if len(sys.argv) <= 1: print('Usage: extract <path>') exit() processFolder(sys.argv[1]) # processFolder('fb2-061748-062680') # processFolder('fb2-089725-092162') # processFolder('fb2-112730-113380') for key, value in tags.items(): print(f'{tagCount[key]: >2}: [{key}] in file {value}')