commit
da71c58b90
2 changed files with 166 additions and 0 deletions
@ -0,0 +1,26 @@
@@ -0,0 +1,26 @@
|
||||
Этот скрипт предназначен для обработки содержимого указанной папки и сбора информации о находящихся в ней файлах. Скрипт разработан для использования в качестве пользовательского действия в файловом менеджере Thunar (XFCE). Это позволяет быстро запускать его из контекстного меню, чтобы подготовить данные для дальнейшей работы, например, в нейросети. Он анализирует файлы, извлекает их основные свойства (размер, даты создания и изменения, тип) и, при возможности, считывает их содержимое. Основное применение — автоматическая подготовка контекста для работы с нейросетями. Отчёт автоматически копируется в буфер обмена. |
||||
|
||||
### Как работает |
||||
- Сканирует папку и её вложенные директории. |
||||
- Исключает скрытые файлы и файлы, содержащие в имени слово "secret". |
||||
- Определяет тип файла с помощью библиотеки `python-magic`. |
||||
|
||||
### Что делает с отчётом |
||||
- В начале приводит структуру файлов и каталогов. |
||||
- Добавляет содержимое текстовых файлов и файлов программного кода в отчёт. |
||||
- Для нетекстовых файлов добавляет информацию о размере. |
||||
- В конце отчёта добавляется системное сообщение с просьбой не отвечать на это сообщение. |
||||
- Копирует отчёт в буфер обмена с помощью библиотеки `pyperclip`. |
||||
|
||||
|
||||
### Установка зависимостей |
||||
Перед использованием установите необходимые библиотеки: |
||||
```bash |
||||
pip install python-magic pyperclip |
||||
``` |
||||
|
||||
### Использование |
||||
Запустите скрипт из терминала, указав путь к папке: |
||||
```bash |
||||
python preparer.py <путь_к_папке> |
||||
``` |
@ -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…
Reference in new issue