/
2FIVE
/
Laba1_python_arhivator
Обзор
Документация
Войти
/
2FIVE
/
Laba1_python_arhivator
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
create_test_data.py
401 строка
17 KB
2FIVE192
Add files via upload
08 дек 2025, 17:48
Не верифицирован
08 дек 2025, 17:48
fd01d2f
Код
Авторство
О чём код?
""" Скрипт для создания тестовых данных для архиватора """ import os import sys import time from pathlib import Path # Настройка кодировки для Windows if sys.platform == "win32": import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace') def create_test_data(): """Создать тестовые файлы и директории для демонстрации""" print("=" * 60) print("Создание тестовых данных для архиватора") print("=" * 60) # Удаляем старые тестовые данные если есть test_files = [ 'test_file.txt', 'test_directory', 'large_file.bin', 'archive_test.zst', 'archive_test.bz2', 'archive_test.tar.zst', 'archive_test.tar.bz2', 'extracted_zst', 'extracted_bz2', 'extracted_tarzst', 'extracted_tarbz2', 'demo_file.zst', 'demo_dir.tar.zst', 'demo_extracted', 'demo_dir_extracted', 'screenshot1.zst', 'screenshot2.tar.zst', 'screenshot1_extracted', 'screenshot2_extracted' ] for item in test_files: if os.path.exists(item): if os.path.isdir(item): import shutil shutil.rmtree(item, ignore_errors=True) print(f"Удалена директория: {item}") else: try: os.remove(item) print(f"Удален файл: {item}") except: print(f"Не удалось удалить: {item}") print("\n" + "=" * 60) print("Создание новых тестовых данных") print("=" * 60) # 1. Создаем тестовый файл среднего размера print("\n Создание тестового файла (примерно 1 МБ)...") with open("test_file.txt", "w", encoding="utf-8") as f: # Записываем разнообразные данные для хорошего сжатия for i in range(5000): # Текст с повторениями для хорошего сжатия text = f"Это строка номер {i:04d} с тестовыми данными. " text += "Тестовые данные повторяются для демонстрации работы архиватора. " * 3 f.write(text + "\n") file_size = os.path.getsize("test_file.txt") print(f" Создан test_file.txt ({file_size:,} байт, {file_size/1024/1024:.2f} МБ)") # 2. Создаем большой бинарный файл print("\n Создание большого бинарного файла (примерно 5 МБ)...") with open("large_file.bin", "wb") as f: # файл с повторяющимися паттернами для сжатия pattern = bytes([i % 256 for i in range(1024)]) # 1KB паттерн for _ in range(5 * 1024): # 5 MB f.write(pattern) bin_size = os.path.getsize("large_file.bin") print(f"Создан large_file.bin ({bin_size:,} байт, {bin_size/1024/1024:.2f} МБ)") # 3. Создаем тестовую директорию с разными файлами print("\nСоздание тестовой директории со структурой...") os.makedirs("test_directory", exist_ok=True) # Создание нескольких файлов разных типов files_to_create = [ ("document.txt", "Это текстовый документ\n" + "Содержит несколько строк текста для тестирования архиватора.\n" * 100), ("data.csv", "id,name,value,description\n" + "\n".join([f"{i},Item_{i},{i*1.5:,.2f},Тестовый элемент номер {i}" for i in range(500)])), ("config.json", '{\n' + ' "application": "Archiver Demo",\n' + ' "version": "1.0.0",\n' + ' "settings": {\n' + ' "compression": "zstd",\n' + ' "level": 9,\n' + ' "preserve_permissions": true\n' + ' },\n' + ' "features": ["compression", "decompression", "benchmark", "progress_bar"]\n' + '}\n'), ("readme.md", "# Тестовая директория\n\n" + "Эта директория создана для тестирования консольного архиватора.\n\n" + "## Содержимое\n" + "- Текстовые файлы\n" + "- CSV данные\n" + "- JSON конфигурация\n" + "## Использование\n" + "Для архивации используйте команду:\n" + "```bash\n" + "python archiver.py compress test_directory archive.tar.zst\n" + "```\n") ] for filename, content in files_to_create: filepath = f"test_directory/{filename}" with open(filepath, "w", encoding="utf-8") as f: f.write(content) print(f" Создан файл: {filename}") # Создание поддиректории os.makedirs("test_directory/images", exist_ok=True) os.makedirs("test_directory/logs", exist_ok=True) os.makedirs("test_directory/data/processed", exist_ok=True) print(" Созданы поддиректории: images/, logs/, data/processed/") # Создание файлов в поддиректориях with open("test_directory/logs/app.log", "w") as f: for i in range(100): f.write(f"2024-01-15 10:{i:02d}:00 INFO: Запись лога номер {i}\n") with open("test_directory/data/processed/results.txt", "w") as f: f.write("Результаты обработки:\n" + "="*40 + "\n") for i in range(50): f.write(f"Запись {i}: Успешно обработано\n") # Создание несколько маленьких файлов for i in range(10): with open(f"test_directory/small_file_{i}.txt", "w") as f: f.write(f"Маленький файл номер {i}\n") # Вычисление общего размера директории dir_size = 0 file_count = 0 for dirpath, dirnames, filenames in os.walk("test_directory"): for filename in filenames: filepath = os.path.join(dirpath, filename) dir_size += os.path.getsize(filepath) file_count += 1 print(f" Создана test_directory/") print(f" Всего файлов: {file_count}") print(f" Общий размер: {dir_size:,} байт ({dir_size/1024/1024:.2f} МБ)") # 4. Структура созданных данных print("\n Созданные тестовые данные:") print("-" * 50) test_items = [ ("test_file.txt", file_size), ("large_file.bin", bin_size), ("test_directory/", dir_size) ] for name, size in test_items: size_mb = size / 1024 / 1024 print(f" {name:<25} {size:>12,} байт ({size_mb:>6.2f} МБ)") # 5. Инструкции работы print("\n Создание инструкций...") instructions = """ИНСТРУКЦИИ ДЛЯ ИСПОЛЬЗОВАНИЯ =========================================== 1: Архивация файла с прогресс-баром и временем -------------------------------------------------------- python archiver.py compress test_file.txt screenshot1.zst --benchmark --progress 2: Архивация директории с временем -------------------------------------------- python archiver.py compress test_directory screenshot2.tar.zst --benchmark 3: Распаковка файла с прогресс-баром и временем --------------------------------------------------------- python archiver.py decompress screenshot1.zst screenshot1_extracted --benchmark --progress 4: Распаковка директории с временем --------------------------------------------- python archiver.py decompress screenshot2.tar.zst screenshot2_extracted --benchmark КОМАНДЫ ДЛЯ ПРОВЕРКИ: --------------------- # Сравнить исходный и распакованный файл python -c "import filecmp; print('Файлы идентичны' if filecmp.cmp('test_file.txt', 'screenshot1_extracted/test_file.txt') else 'Файлы различаются')" # Проверить существование распакованной директории python -c "import os; print('Директория существует' if os.path.exists('screenshot2_extracted/test_directory') else 'Директория не найдена')" ОЧИСТКА ТЕСТОВЫХ ДАННЫХ: ------------------------ # Удалить все созданные архивы del *.zst *.bz2 *.tar 2>nul # Удалить распакованные директории rmdir /s /q screenshot1_extracted screenshot2_extracted 2>nul rmdir /s /q demo_extracted demo_dir_extracted 2>nul # Удалить тестовые данные del test_file.txt large_file.bin 2>nul rmdir /s /q test_directory 2>nul ПРИМЕЧАНИЕ: ----------- Для корректной работы убедитесь, что используете Python 3.14 """ with open("INSTRUCTIONS.txt", "w", encoding="utf-8") as f: f.write(instructions) print(" Инструкции сохранены в INSTRUCTIONS.txt") # 6. Скрипт для демонстрации print("\nСоздание демонстрационного скрипта...") demo_script = '''#!/usr/bin/env python3 """ Демонстрационный скрипт для архиватора """ import subprocess import sys import os # Настройка кодировки для Windows if sys.platform == "win32": import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace') def run_command(cmd, description): """Запустить команду и вывести описание""" print(f"\\n{description}") print("-" * 50) print(f"Команда: {' '.join(cmd)}") print() result = subprocess.run(cmd, capture_output=True, text=True, encoding='utf-8') # Вывод результата if result.stdout: print(result.stdout) if result.stderr: print(result.stderr, file=sys.stderr) return result.returncode == 0 def main(): print("ДЕМОНСТРАЦИЯ РАБОТЫ АРХИВАТОРА") print("=" * 50) # Проверяем, что тестовые файлы существуют if not os.path.exists("test_file.txt"): print("Ошибка: файл test_file.txt не найден") print("Сначала создайте тестовые данные:") print(" python create_test_data.py") return if not os.path.exists("test_directory"): print("Ошибка: директория test_directory не найдена") print("Сначала создайте тестовые данные:") print(" python create_test_data.py") return success = True # 1. Архивация файла с прогресс-баром success &= run_command( ['python', 'archiver.py', 'compress', 'test_file.txt', 'demo_file.zst', '--benchmark', '--progress'], "1. Архивация файла с прогресс-баром:" ) # 2. Архивация директории success &= run_command( ['python', 'archiver.py', 'compress', 'test_directory', 'demo_dir.tar.zst', '--benchmark'], "2. Архивация директории:" ) # 3. Распаковка файла с прогресс-баром success &= run_command( ['python', 'archiver.py', 'decompress', 'demo_file.zst', 'demo_extracted', '--benchmark', '--progress'], "3. Распаковка файла с прогресс-баром:" ) # 4. Распаковка директории success &= run_command( ['python', 'archiver.py', 'decompress', 'demo_dir.tar.zst', 'demo_dir_extracted', '--benchmark'], "4. Распаковка директории:" ) if success: print("\\n Демонстрация успешно завершена!") print("\\n Созданные файлы:") for item in ['demo_file.zst', 'demo_dir.tar.zst', 'demo_extracted', 'demo_dir_extracted']: if os.path.exists(item): if os.path.isdir(item): print(f" {item}/") else: size = os.path.getsize(item) print(f" 📄 {item} ({size:,} байт)") else: print("\\n Демонстрация завершилась с ошибками") if __name__ == "__main__": main() ''' with open("demo.py", "w", encoding="utf-8") as f: f.write(demo_script) # Делаем скрипт исполняемым (для Unix-систем) try: os.chmod("demo.py", 0o755) except: pass print(" Создан демонстрационный скрипт demo.py") # 7. Создаем батч-файл для удобства print("\nСоздание вспомогательных файлов...") # Создание run.bat для Windows bat_content = """@echo off REM Запуск архиватора с Python 3.14 set PYTHON_PATH=C:\\Users\\Илья\\AppData\\Local\\Programs\\Python\\Python314\\python.exe echo Используется Python 3.14 echo. %PYTHON_PATH% archiver.py %* """ with open("run.bat", "w", encoding="utf-8") as f: f.write(bat_content) print("Создан run.bat для запуска архиватора") print("\n" + "=" * 60) print("ГОТОВО! Тестовые данные созданы.") print("=" * 60) print("\n Созданные файлы и директории:") created_items = [] for item in sorted(os.listdir('.')): if item.endswith(('.txt', '.bin', '.py', '.bat')) or item == 'test_directory' or item == 'INSTRUCTIONS.txt': if os.path.isdir(item): created_items.append((item, "DIR", 0)) print(f" {item}/") else: size = os.path.getsize(item) created_items.append((item, "FILE", size)) print(f" {item} ({size:,} байт)") # Подсчет общего размера total_size = sum(size for _, typ, size in created_items if typ == "FILE") print(f"\n Итоговая статистика:") print(f" Всего файлов: {sum(1 for _, typ, _ in created_items if typ == 'FILE')}") print(f" Директорий: {sum(1 for _, typ, _ in created_items if typ == 'DIR')}") print(f" Общий размер: {total_size:,} байт ({total_size/1024/1024:.2f} МБ)") print("\n Инструкции по запуску:") print(" 1. Для демонстрации: python demo.py") print(" 2. Для конкретных команд: следуйте инструкциям в INSTRUCTIONS.txt") print(" 3. Для ручного запуска: run.bat compress test_file.txt archive.zst") print("\n Подсказка:") print(" Для конкретных команд используйте команды из INSTRUCTIONS.txt") print(" Убедитесь, что используете Python 3.14 через run.bat") if __name__ == "__main__": create_test_data()