concatenate_files
This commit is contained in:
115
concatenate_files.py
Normal file
115
concatenate_files.py
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
"""
|
||||||
|
Скрипт для объединения всех файлов в дереве каталогов в один .docx файл.
|
||||||
|
Выходной файл будет содержать пути к файлам, за которыми следует их содержимое.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
from docx import Document
|
||||||
|
from docx.shared import Inches
|
||||||
|
import mimetypes
|
||||||
|
|
||||||
|
|
||||||
|
def is_binary_file(file_path):
|
||||||
|
"""
|
||||||
|
Проверяет, является ли файл двоичным, пытаясь прочитать его как текст.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
with open(file_path, 'tr', encoding='utf-8') as check_file:
|
||||||
|
check_file.read(1024) # Читаем первые 1KB для проверки
|
||||||
|
return False
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def should_skip_directory(directory):
|
||||||
|
"""
|
||||||
|
Определяет, нужно ли пропустить каталог на основе общих шаблонов игнорирования.
|
||||||
|
"""
|
||||||
|
skip_dirs = {'.git', '.venv', '__pycache__', 'node_modules', '.pytest_cache',
|
||||||
|
'data', '.idea', '.vscode', 'logs', 'media', 'staticfiles'}
|
||||||
|
return any(skip_dir in directory.parts for skip_dir in skip_dirs)
|
||||||
|
|
||||||
|
|
||||||
|
def should_skip_file(file_path):
|
||||||
|
"""
|
||||||
|
Определяет, нужно ли пропустить файл на основе расширений или шаблонов.
|
||||||
|
"""
|
||||||
|
skip_extensions = {'.jpg', '.jpeg', '.png', '.gif', '.bmp', '.ico', '.svg',
|
||||||
|
'.mp3', '.mp4', '.avi', '.mov', '.pdf', '.zip', '.tar',
|
||||||
|
'.gz', '.exe', '.so', '.dll', '.doc', '.docx', '.xls',
|
||||||
|
'.xlsx', '.ppt', '.pptx', '.db', '.sqlite', '.log'}
|
||||||
|
|
||||||
|
file_ext = Path(file_path).suffix.lower()
|
||||||
|
return file_ext in skip_extensions
|
||||||
|
|
||||||
|
|
||||||
|
def concatenate_files_to_docx():
|
||||||
|
"""
|
||||||
|
Основная функция для объединения всех текстовых файлов в один документ .docx.
|
||||||
|
Обрабатываем только файлы из директорий src/apps и src/config.
|
||||||
|
"""
|
||||||
|
print("Начинаем объединение файлов...")
|
||||||
|
|
||||||
|
# Создаем новый документ Word
|
||||||
|
doc = Document()
|
||||||
|
|
||||||
|
# Добавляем заголовок
|
||||||
|
doc.add_heading('Объединенные файлы', 0)
|
||||||
|
|
||||||
|
# Определяем целевые директории
|
||||||
|
target_dirs = [
|
||||||
|
Path('./src/apps'),
|
||||||
|
Path('./src/config')
|
||||||
|
]
|
||||||
|
|
||||||
|
# Проходим по файлам в целевых директориях
|
||||||
|
for target_dir in target_dirs:
|
||||||
|
if target_dir.exists():
|
||||||
|
for file_path in target_dir.rglob('*'):
|
||||||
|
if file_path.is_file():
|
||||||
|
# Пропускаем определенные типы файлов
|
||||||
|
if should_skip_file(file_path):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Пропускаем, если это двоичный файл
|
||||||
|
if is_binary_file(str(file_path)):
|
||||||
|
print(f"Пропускаем двоичный файл: {file_path}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Добавляем путь к файлу как заголовок
|
||||||
|
doc.add_heading(str(file_path), level=1)
|
||||||
|
|
||||||
|
# Читаем содержимое файла
|
||||||
|
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
|
||||||
|
content = f.read()
|
||||||
|
|
||||||
|
# Удаляем пустые строки из содержимого
|
||||||
|
lines = [line for line in content.splitlines() if line.strip()]
|
||||||
|
clean_content = '\n'.join(lines)
|
||||||
|
|
||||||
|
# Добавляем содержимое в документ
|
||||||
|
if clean_content.strip(): # Добавляем только если есть содержимое
|
||||||
|
doc.add_paragraph(clean_content)
|
||||||
|
else:
|
||||||
|
doc.add_paragraph("[Пустой файл]")
|
||||||
|
|
||||||
|
print(f"Добавлен файл: {file_path}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
error_msg = f"Ошибка чтения файла {file_path}: {str(e)}"
|
||||||
|
print(error_msg)
|
||||||
|
doc.add_heading(f"ОШИБКА: {file_path}", level=1)
|
||||||
|
doc.add_paragraph(error_msg)
|
||||||
|
else:
|
||||||
|
print(f"Целевая директория не найдена: {target_dir}")
|
||||||
|
|
||||||
|
# Сохраняем документ
|
||||||
|
output_filename = "один_файл_state_corp.docx"
|
||||||
|
doc.save(output_filename)
|
||||||
|
print(f"\nУспешно создан {output_filename} с объединенным содержимым!")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
concatenate_files_to_docx()
|
||||||
@@ -50,6 +50,7 @@ dependencies = [
|
|||||||
"playwright>=1.57.0",
|
"playwright>=1.57.0",
|
||||||
"pylint>=3.0",
|
"pylint>=3.0",
|
||||||
"whitenoise>=6.11.0",
|
"whitenoise>=6.11.0",
|
||||||
|
"python-docx>=1.2.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[project.optional-dependencies]
|
[project.optional-dependencies]
|
||||||
|
|||||||
BIN
один_файл_state_corp.docx
Normal file
BIN
один_файл_state_corp.docx
Normal file
Binary file not shown.
Reference in New Issue
Block a user