polevoy_sergey_lab_2 #195

Open
ChipsEater wants to merge 2 commits from polevoy_sergey_lab_2 into main
7 changed files with 148 additions and 0 deletions

2
polevoy_sergey_lab_2/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
data
result

View File

@ -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

View File

@ -0,0 +1,8 @@
# Образ с нужной версией python
FROM python:3.12-alpine
# Указание рабочей папки
WORKDIR /app
# Копирование исходного файла в рабочую папку
COPY first.py .
# Команда запуска
CMD ["python", "first.py"]

View File

@ -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)

View File

@ -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)

View File

@ -0,0 +1,8 @@
# Образ с нужной версией python
FROM python:3.12-alpine
# Указание рабочей папки
WORKDIR /app
# Копирование исходного файла в рабочую папку
COPY second.py .
# Команда запуска
CMD ["python", "second.py"]

View File

@ -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)