Загрузка данных



from pathlib import Path
from docx import Document
from docx.shared import Cm, Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_CELL_VERTICAL_ALIGNMENT

# Папка, в которой находятся файлы
FOLDER = Path(r"C:\Users\User\Desktop\Файлы")

# Путь для сохранения документа Word
OUTPUT = FOLDER / "Список файлов.docx"

# Искать файлы во вложенных папках?
SEARCH_SUBFOLDERS = False

# Названия типов файлов в зависимости от расширения
FILE_TYPES = {
    ".pdf": "PDF-документ",
    ".doc": "Документ Word",
    ".docx": "Документ Word",
    ".xls": "Таблица Excel",
    ".xlsx": "Таблица Excel",
    ".csv": "Таблица CSV",
    ".ppt": "Презентация PowerPoint",
    ".pptx": "Презентация PowerPoint",
    ".txt": "Текстовый файл",
    ".rtf": "Текстовый документ RTF",
    ".jpg": "Изображение",
    ".jpeg": "Изображение",
    ".png": "Изображение",
    ".gif": "Изображение",
    ".bmp": "Изображение",
    ".tif": "Изображение",
    ".tiff": "Изображение",
    ".svg": "Векторное изображение",
    ".dwg": "Чертёж AutoCAD",
    ".dxf": "Чертёж DXF",
    ".zip": "Архив ZIP",
    ".rar": "Архив RAR",
    ".7z": "Архив 7Z",
    ".exe": "Исполняемый файл",
    ".msi": "Установочный файл",
    ".py": "Скрипт Python",
    ".js": "Скрипт JavaScript",
    ".html": "HTML-документ",
    ".css": "Таблица стилей CSS",
    ".json": "Файл JSON",
    ".xml": "Файл XML",
    ".mp3": "Аудиофайл",
    ".wav": "Аудиофайл",
    ".mp4": "Видеофайл",
    ".avi": "Видеофайл",
    ".mov": "Видеофайл",
    ".mkv": "Видеофайл",
}


def get_file_type(file_path):
    """Определяет тип файла по расширению."""
    extension = file_path.suffix.lower()

    if not extension:
        return "Файл без расширения"

    return FILE_TYPES.get(
        extension,
        f"Другой файл ({extension})"
    )


def main():
    if not FOLDER.exists() or not FOLDER.is_dir():
        print(f"Папка не найдена: {FOLDER}")
        return

    # Получаем список файлов
    if SEARCH_SUBFOLDERS:
        files = [
            path for path in FOLDER.rglob("*")
            if path.is_file() and path != OUTPUT
        ]
    else:
        files = [
            path for path in FOLDER.iterdir()
            if path.is_file() and path != OUTPUT
        ]

    # Сортировка по имени файла
    files.sort(key=lambda path: path.name.lower())

    # Создаём документ Word
    document = Document()
    document.add_heading("Список файлов", level=1)

    table = document.add_table(rows=1, cols=3)
    table.style = "Table Grid"
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    table.autofit = False

    # Ширина колонок
    widths = [Cm(1.5), Cm(9), Cm(6)]

    headers = ["№", "Название файла", "Тип файла"]

    # Заполняем заголовок
    for i, header in enumerate(headers):
        cell = table.rows[0].cells[i]
        cell.text = header
        cell.width = widths[i]
        cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER

        for paragraph in cell.paragraphs:
            paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
            for run in paragraph.runs:
                run.bold = True
                run.font.size = Pt(10)

    # Заполняем таблицу
    for number, file_path in enumerate(files, start=1):
        cells = table.add_row().cells

        values = [
            str(number),
            file_path.name,
            get_file_type(file_path)
        ]

        for i, value in enumerate(values):
            cells[i].text = value
            cells[i].width = widths[i]
            cells[i].vertical_alignment = (
                WD_CELL_VERTICAL_ALIGNMENT.CENTER
            )

            for paragraph in cells[i].paragraphs:
                if i == 0:
                    paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER

                for run in paragraph.runs:
                    run.font.size = Pt(10)

    # Сохраняем документ
    document.save(OUTPUT)

    print(f"Готово! Найдено файлов: {len(files)}")
    print(f"Документ сохранён: {OUTPUT}")


if __name__ == "__main__":
    main()