Browse Source

first commit

master
FedorSarafanov 3 months ago
commit
da71c58b90
  1. 26
      README.md
  2. 140
      preparer

26
README.md

@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
Этот скрипт предназначен для обработки содержимого указанной папки и сбора информации о находящихся в ней файлах. Скрипт разработан для использования в качестве пользовательского действия в файловом менеджере Thunar (XFCE). Это позволяет быстро запускать его из контекстного меню, чтобы подготовить данные для дальнейшей работы, например, в нейросети. Он анализирует файлы, извлекает их основные свойства (размер, даты создания и изменения, тип) и, при возможности, считывает их содержимое. Основное применение — автоматическая подготовка контекста для работы с нейросетями. Отчёт автоматически копируется в буфер обмена.
### Как работает
- Сканирует папку и её вложенные директории.
- Исключает скрытые файлы и файлы, содержащие в имени слово "secret".
- Определяет тип файла с помощью библиотеки `python-magic`.
### Что делает с отчётом
- В начале приводит структуру файлов и каталогов.
- Добавляет содержимое текстовых файлов и файлов программного кода в отчёт.
- Для нетекстовых файлов добавляет информацию о размере.
- В конце отчёта добавляется системное сообщение с просьбой не отвечать на это сообщение.
- Копирует отчёт в буфер обмена с помощью библиотеки `pyperclip`.
### Установка зависимостей
Перед использованием установите необходимые библиотеки:
```bash
pip install python-magic pyperclip
```
### Использование
Запустите скрипт из терминала, указав путь к папке:
```bash
python preparer.py <путь_к_папке>
```

140
preparer

@ -0,0 +1,140 @@ @@ -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()
Loading…
Cancel
Save