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