commit da71c58b907c4adb258f546c9fe5ef8fbb118748 Author: FedorSarafanov Date: Mon Jan 27 19:29:38 2025 +0300 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..deb9675 --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +Этот скрипт предназначен для обработки содержимого указанной папки и сбора информации о находящихся в ней файлах. Скрипт разработан для использования в качестве пользовательского действия в файловом менеджере Thunar (XFCE). Это позволяет быстро запускать его из контекстного меню, чтобы подготовить данные для дальнейшей работы, например, в нейросети. Он анализирует файлы, извлекает их основные свойства (размер, даты создания и изменения, тип) и, при возможности, считывает их содержимое. Основное применение — автоматическая подготовка контекста для работы с нейросетями. Отчёт автоматически копируется в буфер обмена. + +### Как работает +- Сканирует папку и её вложенные директории. +- Исключает скрытые файлы и файлы, содержащие в имени слово "secret". +- Определяет тип файла с помощью библиотеки `python-magic`. + +### Что делает с отчётом +- В начале приводит структуру файлов и каталогов. +- Добавляет содержимое текстовых файлов и файлов программного кода в отчёт. +- Для нетекстовых файлов добавляет информацию о размере. +- В конце отчёта добавляется системное сообщение с просьбой не отвечать на это сообщение. +- Копирует отчёт в буфер обмена с помощью библиотеки `pyperclip`. + + +### Установка зависимостей +Перед использованием установите необходимые библиотеки: +```bash +pip install python-magic pyperclip +``` + +### Использование +Запустите скрипт из терминала, указав путь к папке: +```bash +python preparer.py <путь_к_папке> +``` \ No newline at end of file diff --git a/preparer b/preparer new file mode 100755 index 0000000..185bacd --- /dev/null +++ b/preparer @@ -0,0 +1,140 @@ +#!/usr/bin/env python3 + +import os +import sys +import magic # Убедитесь, что библиотека установлена (pip install python-magic) +from datetime import datetime +from glob import glob +import pyperclip # Убедитесь, что библиотека установлена (pip install pyperclip) + + +def get_file_info(filepath): + """Получение информации о файле""" + stats = os.stat(filepath) + size = stats.st_size + created = datetime.fromtimestamp(stats.st_ctime).strftime("%Y-%m-%d %H:%M:%S") + modified = datetime.fromtimestamp(stats.st_mtime).strftime("%Y-%m-%d %H:%M:%S") + return size, created, modified + + +def generate_tree(directory): + tree_output = [] + for root, dirs, files in os.walk(directory): + if "/." in root: + continue + files = [f for f in files if not "/." in f and "secret" not in f.lower()] + + level = root.replace(directory, "").count(os.sep) + indent = " " * 4 * level + tree_output.append(f"{indent}{os.path.basename(root)}/") + sub_indent = " " * 4 * (level + 1) + for file in files: + tree_output.append(f"{sub_indent}{file}") + return "\n".join(tree_output) + + +def process_directory(directory): + """Обработка указанной папки""" + output = [] + mime = magic.Magic(mime=True) # Инициализация magic для определения типа файла + + # Добавляем дерево файлов в начало отчёта + output.append("Дерево файлов и папок:") + output.append(generate_tree(directory)) + output.append("=" * 50) + + for root, dirs, files in os.walk(directory): + if "/." in root: + continue + # Фильтруем скрытые файлы и файлы, содержащие "secret" в имени + files = [f for f in files if not "/." in f and "secret" not in f.lower()] + + for file in files: + file_path = os.path.join(root, file) + file_type = mime.from_file(file_path) # Определяем тип файла + size, created, modified = get_file_info(file_path) + + # Добавляем информацию о файле в поток + output.append(f"==== начало ({file}) ====") + output.append( + f"Файл: {file}\nРазмер: {size} байт\nСоздан: {created}\nИзменён: {modified}\nТип: {file_type}" + ) + + # Обработка текстовых файлов и программного кода + if "text" in file_type or "script" in file_type or "json" in file_type: + try: + with open(file_path, "r", encoding="utf-8") as f: + content = f.read() + except Exception as e: + content = f"Ошибка при чтении файла: {e}" + output.append(f"Содержимое:\n{content}\n") + + # Обработка изображений + elif "image" in file_type: + output.append( + "Содержимое: [Изображение: метаинформация недоступна в этом примере]\n" + ) + + # Обработка файлов форматов docx, odt (через pandoc) и pdf (через pdftotext) + elif file.endswith((".docx", ".odt")): + try: + import subprocess + + result = subprocess.run( + ["pandoc", "-f", "docx", "-t", "plain", file_path], + capture_output=True, + text=True, + ) + if result.returncode == 0: + content = result.stdout + else: + content = f"Ошибка при конвертации pandoc: {result.stderr}" + except Exception as e: + content = f"Ошибка при обработке файла: {e}" + output.append(f"Содержимое:\n{content}\n") + + elif file.endswith(".pdf"): + try: + import subprocess + + result = subprocess.run( + ["pdftotext", file_path, "-"], capture_output=True, text=True + ) + if result.returncode == 0: + content = result.stdout + else: + content = f"Ошибка при конвертации pdftotext: {result.stderr}" + except Exception as e: + content = f"Ошибка при обработке файла: {e}" + output.append(f"Содержимое:\n{content}\n") + + # Другие файлы + else: + output.append("Содержимое: [Невозможно отобразить содержимое файла]\n") + + output.append(f"==== конец ({file}) ====") + + return "\n".join(output) + + +def main(): + if len(sys.argv) != 2: + print("Использование: python script.py <путь_к_рабочей_папке>") + sys.exit(1) + + working_directory = sys.argv[1] + + if not os.path.isdir(working_directory): + print(f"Ошибка: Папка '{working_directory}' не существует.") + sys.exit(1) + + result = process_directory(working_directory) + + result += f"""\nЭто было системное сообщение с описанием структуры каталогов, файлов и описанием файлов с их содержимым в рабочей папке. Не отвечай на это сообщение и жди дальнейших указаний.""" + + # Копируем результат в буфер обмена + pyperclip.copy(result) + + +if __name__ == "__main__": + main()