forked from Alexey/DAS_2024_1
mochalov_danila_lab_2 is ready
This commit is contained in:
parent
85b809333b
commit
66ffe827f8
2
mochalov_danila_lab_2/.gitignore
vendored
Normal file
2
mochalov_danila_lab_2/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
data
|
||||||
|
result
|
38
mochalov_danila_lab_2/README.md
Normal file
38
mochalov_danila_lab_2/README.md
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# Лабораторная работа №2
|
||||||
|
#### ПИбд-42. Мочалов Данила.
|
||||||
|
|
||||||
|
#### Задание:
|
||||||
|
Для выполнения лабораторной работы были выбраны следущие варианты программ:
|
||||||
|
- Ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt.
|
||||||
|
- Сохраняет произведение первого и последнего числа из файла /var/data/data.txt в /var/result/result.txt.
|
||||||
|
Так как по заданию исходными данными для второй программы должен быть результат выполнения первой программы, было принято решение для второй программы брать данные из файла */var/result/data.txt*
|
||||||
|
Также было принято решение генерировать файлы для выполнения первой программы в ней же.
|
||||||
|
|
||||||
|
#### При выполнении использовал:
|
||||||
|
- Python 3.12
|
||||||
|
- Docker
|
||||||
|
- Docker Compose
|
||||||
|
|
||||||
|
#### Инструкция:
|
||||||
|
Для запуска лабораторной работы, перейдите в папку *mochalov_danila_lab_2* и выполните команду:
|
||||||
|
```
|
||||||
|
docker-compose up --build
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Результат
|
||||||
|
```
|
||||||
|
[+] Running 3/3
|
||||||
|
✔ Network mochalov_danila_lab_2_default Created 0.1s
|
||||||
|
✔ Container mochalov_danila_lab_2-app_1-1 Created 0.1s
|
||||||
|
✔ Container mochalov_danila_lab_2-app_2-1 Created 0.1s
|
||||||
|
Attaching to app_1-1, app_2-1
|
||||||
|
app_1-1 | Создано 19 файлов в директории /var/data.
|
||||||
|
app_1-1 | Самый большой файл: /var/data/file_3.txt (288 байт) скопирован в /var/result/data.txt.
|
||||||
|
app_2-1 | Произведение первого и последнего числа (55 * 1) = 55 сохранено в /var/result/result.txt.
|
||||||
|
|
||||||
|
app_1-1 exited with code 0
|
||||||
|
app_2-1 exited with code 0
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Демонстрация работы
|
||||||
|
Доступна по [ссылке](https://drive.google.com/file/d/1Z0T5dYIZ4s3_MstOLmLX86JN072SDpea/view?usp=sharing)
|
8
mochalov_danila_lab_2/app_1/Dockerfile
Normal file
8
mochalov_danila_lab_2/app_1/Dockerfile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# Образ с Python 3.12
|
||||||
|
FROM python:3.12
|
||||||
|
# Указываем рабочую директорию
|
||||||
|
WORKDIR /app
|
||||||
|
# Копируем в нее файл скрипта
|
||||||
|
COPY app_1.py .
|
||||||
|
# Команда запуска скрипта
|
||||||
|
CMD ["python", "app_1.py"]
|
64
mochalov_danila_lab_2/app_1/app_1.py
Normal file
64
mochalov_danila_lab_2/app_1/app_1.py
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
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)
|
||||||
|
|
||||||
|
# Генерируем случайное количество файлов (от 10 до 20)
|
||||||
|
num_files = random.randint(10, 20)
|
||||||
|
|
||||||
|
for i in range(1, num_files + 1):
|
||||||
|
# Указываем имя файла
|
||||||
|
file_name = f"file_{i}.txt"
|
||||||
|
file_path = os.path.join(directory, file_name)
|
||||||
|
|
||||||
|
# Генерируем случайное количество чисел (от 5 до 100)
|
||||||
|
num_numbers = random.randint(5, 100)
|
||||||
|
numbers = [str(random.randint(0, 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_largest_file(source_directory, destination_directory, destination_file):
|
||||||
|
# Убедимся, что директория назначения существует
|
||||||
|
os.makedirs(destination_directory, exist_ok=True)
|
||||||
|
|
||||||
|
# Поиск самого большого файла
|
||||||
|
largest_file = None
|
||||||
|
largest_size = 0
|
||||||
|
|
||||||
|
for file_name in os.listdir(source_directory):
|
||||||
|
file_path = os.path.join(source_directory, file_name)
|
||||||
|
|
||||||
|
if os.path.isfile(file_path):
|
||||||
|
file_size = os.path.getsize(file_path)
|
||||||
|
|
||||||
|
if file_size > largest_size:
|
||||||
|
largest_size = file_size
|
||||||
|
largest_file = file_path
|
||||||
|
|
||||||
|
# Если найден самый большой файл, копируем его содержимое
|
||||||
|
if largest_file:
|
||||||
|
shutil.copy(largest_file, destination_file)
|
||||||
|
print(f"Самый большой файл: {largest_file} ({largest_size} байт) скопирован в {destination_file}.")
|
||||||
|
else:
|
||||||
|
print("В каталоге нет файлов для копирования.")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
generate_random_files(source_directory)
|
||||||
|
find_and_copy_largest_file(source_directory, destination_directory, destination_file)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
8
mochalov_danila_lab_2/app_2/Dockerfile
Normal file
8
mochalov_danila_lab_2/app_2/Dockerfile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# Образ с Python 3.12
|
||||||
|
FROM python:3.12
|
||||||
|
# Указываем рабочую директорию
|
||||||
|
WORKDIR /app
|
||||||
|
# Копируем в нее файл скрипта
|
||||||
|
COPY app_2.py .
|
||||||
|
# Команда запуска скрипта
|
||||||
|
CMD ["python", "app_2.py"]
|
40
mochalov_danila_lab_2/app_2/app_2.py
Normal file
40
mochalov_danila_lab_2/app_2/app_2.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
# Пути к файлам
|
||||||
|
data_file = "/var/result/data.txt"
|
||||||
|
result_file = "/var/result/result.txt"
|
||||||
|
|
||||||
|
# Функция для вычисления произведения первого и последнего числа
|
||||||
|
def calculate(data_file, result_file):
|
||||||
|
try:
|
||||||
|
# Открываем файл и читаем строки
|
||||||
|
with open(data_file, 'r') as f:
|
||||||
|
numbers = f.readlines()
|
||||||
|
|
||||||
|
# Преобразуем строки в числа, убирая лишние символы
|
||||||
|
numbers = [int(num.strip()) for num in numbers if num.strip().isdigit()]
|
||||||
|
|
||||||
|
if len(numbers) < 2:
|
||||||
|
print("Недостаточно чисел в файле для вычисления произведения.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Первое и последнее числа
|
||||||
|
first_number = numbers[0]
|
||||||
|
last_number = numbers[-1]
|
||||||
|
|
||||||
|
# Вычисляем произведение
|
||||||
|
product = first_number * last_number
|
||||||
|
|
||||||
|
# Записываем результат в файл
|
||||||
|
with open(result_file, 'w') as f:
|
||||||
|
f.write(str(product))
|
||||||
|
|
||||||
|
print(f"Произведение первого и последнего числа ({first_number} * {last_number}) = {product} сохранено в {result_file}.")
|
||||||
|
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(f"Файл {data_file} не найден.")
|
||||||
|
except ValueError:
|
||||||
|
print("Ошибка в данных файла. Убедитесь, что файл содержит только числа.")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
calculate(data_file, result_file)
|
18
mochalov_danila_lab_2/docker-compose.yaml
Normal file
18
mochalov_danila_lab_2/docker-compose.yaml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
services:
|
||||||
|
# Сервис с первым скриптом
|
||||||
|
app_1:
|
||||||
|
build:
|
||||||
|
context: ./app_1/ # Указываем путь к директории скрипта и Dockerfile
|
||||||
|
volumes: # Монтируем локальную директорию с данными в /var/data и локальную директорию с результирующими данными в /var/result
|
||||||
|
- ./data:/var/data
|
||||||
|
- ./result:/var/result
|
||||||
|
|
||||||
|
# Сервис со вторым скриптом
|
||||||
|
app_2:
|
||||||
|
depends_on: # Выполняем второй скрипт после завершения первого
|
||||||
|
- app_1
|
||||||
|
build:
|
||||||
|
context: ./app_2/ # Указываем путь к директории скрипта и Dockerfile
|
||||||
|
volumes: # Монтируем локальную директорию с данными в /var/data и локальную директорию с результирующими данными в /var/result
|
||||||
|
- ./data:/var/data
|
||||||
|
- ./result:/var/result
|
Loading…
Reference in New Issue
Block a user