diff --git a/polevoy_sergey_lab_2/.gitignore b/polevoy_sergey_lab_2/.gitignore new file mode 100644 index 0000000..d8adfc8 --- /dev/null +++ b/polevoy_sergey_lab_2/.gitignore @@ -0,0 +1,2 @@ +data +result \ No newline at end of file diff --git a/polevoy_sergey_lab_2/docker-compose.yml b/polevoy_sergey_lab_2/docker-compose.yml new file mode 100644 index 0000000..8eee1c3 --- /dev/null +++ b/polevoy_sergey_lab_2/docker-compose.yml @@ -0,0 +1,18 @@ +services: + # Сервис с первым скриптом + first: + build: + context: ./first/ # Указываем путь к директории скрипта и Dockerfile + volumes: # Монтируем локальную директорию с данными в /var/data и локальную директорию с результирующими данными в /var/result + - ./data:/var/data + - ./result:/var/result + + # Сервис со вторым скриптом + second: + depends_on: # Второй скрипт выполнится после первого + - first + build: + context: ./second/ + volumes: + - ./data:/var/data + - ./result:/var/result \ No newline at end of file diff --git a/polevoy_sergey_lab_2/first/Dockerfile b/polevoy_sergey_lab_2/first/Dockerfile new file mode 100644 index 0000000..d36cf12 --- /dev/null +++ b/polevoy_sergey_lab_2/first/Dockerfile @@ -0,0 +1,8 @@ +# Образ с нужной версией python +FROM python:3.12-alpine +# Указание рабочей папки +WORKDIR /app +# Копирование исходного файла в рабочую папку +COPY first.py . +# Команда запуска +CMD ["python", "first.py"] \ No newline at end of file diff --git a/polevoy_sergey_lab_2/first/first.py b/polevoy_sergey_lab_2/first/first.py new file mode 100644 index 0000000..57e7f3e --- /dev/null +++ b/polevoy_sergey_lab_2/first/first.py @@ -0,0 +1,59 @@ +import os +import random +import shutil + +# Задаются пути к папкам и файлам +source_directory = "/var/data" +destination_directory = "/var/result" +destination_file = os.path.join(destination_directory, "data.txt") + +# Создание случайных файлов для работы системы, так как заранее файлы нерационально создавать +def generate_random_files(directory): + # Создание необходимых папок, если они не существуют, если существуют, то пропускаем + os.makedirs(directory, exist_ok=True) + + # Будет от 5 до 10 файлов + num_files = random.randint(5, 10) + + for i in range(1, num_files + 1): + file_name = f"file_{i}.txt" + file_path = os.path.join(directory, file_name) + + # Будет от 1 до 100 чисел со значением от 1 до 100 + num_numbers = random.randint(1, 100) + numbers = [str(random.randint(1, 100)) for _ in range(num_numbers)] + + # Числа сохраняются в файл каждое на новой строке + with open(file_path, 'w') as f: + f.write("\n".join(numbers)) + + print(f"Создано {num_files} файлов в директории {directory}.") + +# Находится файл с самым большим количеством строк и копируется в папку назначения +def find_and_copy_longest_file(source_dir, destination_file): + if not os.path.exists(source_dir) or not os.path.isdir(source_dir): + return print ("Папки с данными не существует. Завершение выполнения") + + longest_file = None + longest_lines = 0 + + for filename in os.listdir(source_dir): + filepath = os.path.join(source_dir, filename) + + with open(filepath, mode="r") as file: + length = len(file.readlines()) + + if length > longest_lines: + longest_file = filepath + longest_lines = length + + if longest_file is None: + return print("Папка с данными пуста. Завершение выполнения") + + shutil.copy(longest_file, destination_file) + print(f"Файл \"{longest_file}\" с количеством строк {longest_lines} скопирован в {destination_file}") + + +if __name__ == "__main__": + generate_random_files(source_directory) + find_and_copy_longest_file(source_directory, destination_file) diff --git a/polevoy_sergey_lab_2/readme.md b/polevoy_sergey_lab_2/readme.md new file mode 100644 index 0000000..83e526d --- /dev/null +++ b/polevoy_sergey_lab_2/readme.md @@ -0,0 +1,35 @@ +# Лабораторная работа №2 +#### ПИбд-42. Полевой Сергей. + +#### Задание: +Для используемых программ были выбраны следующие варианты: +1) **Вариант 1**: Ищет в каталоге ```/var/data``` файл с наибольшим количеством строк и перекладывает его в ```/var/result/data.txt```. +2) **Вариант 1**: Ищет набольшее число из файла ```/var/data/data.txt``` и сохраняет его вторую степень в ```/var/result/result.txt```. +При этом для предварительного заполнения данными первый скрипт создаёт необходимые файлы с числами, а уже потом реализует функционал из варианта + +#### При выполнении были использованы: +- Python 3.12 +- Docker +- Docker Compose + +#### Инструкция: +Для запуска лабораторной работы, перейдите в папку *polevoy_sergey_lab_2* и выполните команду: +``` +docker-compose up --build --remove-orphans +``` + +#### Результат +``` +[+] Running 2/2 + ✔ Container polevoy_sergey_lab_2-first-1 Created 0.0s + ✔ Container polevoy_sergey_lab_2-second-1 Recreated 0.2s +Attaching to first-1, second-1 +first-1 | Создано 6 файлов в директории /var/data. +first-1 | Файл "/var/data/file_1.txt" с количеством строк 80 скопирован в /var/result/data.txt +first-1 exited with code 0 +second-1 | В файл /var/result/result.txt записано наибольшее число во второй степени из файла /var/result/data.txt +second-1 exited with code 0 +``` + +#### Демонстрация работы +Доступна по [ссылке](https://disk.yandex.ru/i/5su3yVLoaOBCrA) \ No newline at end of file diff --git a/polevoy_sergey_lab_2/second/Dockerfile b/polevoy_sergey_lab_2/second/Dockerfile new file mode 100644 index 0000000..c26dcc2 --- /dev/null +++ b/polevoy_sergey_lab_2/second/Dockerfile @@ -0,0 +1,8 @@ +# Образ с нужной версией python +FROM python:3.12-alpine +# Указание рабочей папки +WORKDIR /app +# Копирование исходного файла в рабочую папку +COPY second.py . +# Команда запуска +CMD ["python", "second.py"] \ No newline at end of file diff --git a/polevoy_sergey_lab_2/second/second.py b/polevoy_sergey_lab_2/second/second.py new file mode 100644 index 0000000..8c993e8 --- /dev/null +++ b/polevoy_sergey_lab_2/second/second.py @@ -0,0 +1,18 @@ +import os + +# Указание путей к файлу данных и результирующему файлу +data_file = "/var/result/data.txt" +result_file = "/var/result/result.txt" + +def power_greatest_number(source_file, result_file): + with open(source_file, mode="r") as file: + largest_number = max(int(number) for number in file.readlines()) + + with open(result_file, mode="w") as file: + file.write(str(largest_number ** 2)) + + print(f"В файл {result_file} записано наибольшее число во второй степени из файла {source_file}") + + +if __name__ == "__main__": + power_greatest_number(data_file, result_file)