1
0
mirror of https://github.com/vanyagoncharov/parser_1cmycloud.git synced 2026-06-19 17:18:10 +02:00
Files
parser_1cmycloud/remove_page_numbers.py
2026-01-13 10:31:04 +03:00

165 lines
6.8 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Скрипт для удаления номеров страниц из названий папок
Переименовывает: page_123_Название -> Название
"""
import os
import re
import sys
import io
from pathlib import Path
# Настройка UTF-8 для вывода в консоль (для Windows)
if sys.platform == 'win32':
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace')
def remove_page_numbers(pages_dir='pages', dry_run=True):
"""
Удаляет номера страниц из названий папок
Args:
pages_dir: Директория с папками страниц
dry_run: Если True - только показывает что будет сделано
"""
pages_path = Path(pages_dir)
if not pages_path.exists():
print(f"❌ Директория {pages_dir} не найдена!")
return
print(f"🔍 Сканирую папки в {pages_dir}...\n")
# Рекурсивно находим все папки с форматом page_XXX_*
all_folders = []
def scan_folder(folder_path, depth=0):
"""Рекурсивно сканирует папки"""
try:
for item in sorted(folder_path.iterdir()):
if item.is_dir():
# Проверяем формат: page_XXX_*
match = re.match(r'page_(\d+)_(.+)', item.name)
if match:
page_num = match.group(1)
new_name = match.group(2)
# Убираем " _ 1С_Предприятие.Элемент" в конце
if new_name.endswith(' _ 1С_Предприятие.Элемент'):
new_name = new_name[:-len(' _ 1С_Предприятие.Элемент')]
all_folders.append({
'path': item,
'old_name': item.name,
'new_name': new_name,
'page_num': page_num,
'depth': depth
})
# Рекурсивно сканируем вложенные папки
scan_folder(item, depth + 1)
except PermissionError as e:
print(f"⚠️ Нет доступа к папке: {folder_path}")
scan_folder(pages_path)
print(f"📊 Найдено папок для переименования: {len(all_folders)}\n")
if not all_folders:
print("✅ Папок для переименования не найдено!")
return
# Сортируем по глубине (от глубоких к верхним) чтобы избежать конфликтов
all_folders.sort(key=lambda x: x['depth'], reverse=True)
print("📋 План переименования:\n")
# Группируем по глубине для красивого вывода
by_depth = {}
for folder in all_folders:
depth = folder['depth']
if depth not in by_depth:
by_depth[depth] = []
by_depth[depth].append(folder)
for depth in sorted(by_depth.keys()):
print(f" Уровень {depth}: {len(by_depth[depth])} папок")
print()
# Показываем первые 10 примеров
print("Примеры переименования (первые 10):")
for i, folder in enumerate(all_folders[:10]):
indent = " " * folder['depth']
print(f"{indent}📦 {folder['old_name']}")
print(f"{indent}{folder['new_name']}")
if len(all_folders) > 10:
print(f" ... и еще {len(all_folders) - 10} папок")
print()
if dry_run:
print("⚠️ Режим DRY RUN - файлы не будут переименованы")
print(" Запустите с --apply для применения изменений")
return
# Применяем переименование
print("🚀 Применяю переименование...\n")
renamed = 0
errors = 0
skipped = 0
for folder in all_folders:
try:
old_path = folder['path']
new_path = old_path.parent / folder['new_name']
# Проверяем что источник существует
if not old_path.exists():
print(f" ⚠️ Пропускаю (не существует): {folder['old_name']}")
skipped += 1
continue
# Проверяем что цель не существует
if new_path.exists() and new_path != old_path:
print(f" ⚠️ Пропускаю (уже существует): {folder['new_name']}")
skipped += 1
continue
# Переименовываем
old_path.rename(new_path)
renamed += 1
if renamed <= 20 or renamed % 100 == 0:
indent = " " * folder['depth']
print(f"{indent}{folder['old_name']}{folder['new_name']}")
except Exception as e:
errors += 1
print(f" ❌ Ошибка при переименовании {folder['old_name']}: {e}")
print(f"\n{'='*60}")
print(f"✅ Переименование завершено!")
print(f" Переименовано: {renamed}")
print(f" Пропущено: {skipped}")
print(f" Ошибок: {errors}")
print(f"{'='*60}")
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description='Удаление номеров страниц из названий папок')
parser.add_argument('--pages-dir', type=str, default='pages',
help='Директория с папками страниц (по умолчанию: pages)')
parser.add_argument('--apply', action='store_true',
help='Применить изменения (по умолчанию: только показать план)')
args = parser.parse_args()
print("🗂️ Удаление номеров страниц из названий папок\n")
remove_page_numbers(args.pages_dir, dry_run=not args.apply)