polevoy_sergey_lab_2 #195
2
polevoy_sergey_lab_2/.gitignore
vendored
Normal file
2
polevoy_sergey_lab_2/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
data
|
||||
result
|
18
polevoy_sergey_lab_2/docker-compose.yml
Normal file
18
polevoy_sergey_lab_2/docker-compose.yml
Normal 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
|
8
polevoy_sergey_lab_2/first/Dockerfile
Normal file
8
polevoy_sergey_lab_2/first/Dockerfile
Normal file
@ -0,0 +1,8 @@
|
||||
# Образ с нужной версией python
|
||||
FROM python:3.12-alpine
|
||||
# Указание рабочей папки
|
||||
WORKDIR /app
|
||||
# Копирование исходного файла в рабочую папку
|
||||
COPY first.py .
|
||||
# Команда запуска
|
||||
CMD ["python", "first.py"]
|
59
polevoy_sergey_lab_2/first/first.py
Normal file
59
polevoy_sergey_lab_2/first/first.py
Normal 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)
|
35
polevoy_sergey_lab_2/readme.md
Normal file
35
polevoy_sergey_lab_2/readme.md
Normal 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)
|
8
polevoy_sergey_lab_2/second/Dockerfile
Normal file
8
polevoy_sergey_lab_2/second/Dockerfile
Normal file
@ -0,0 +1,8 @@
|
||||
# Образ с нужной версией python
|
||||
FROM python:3.12-alpine
|
||||
# Указание рабочей папки
|
||||
WORKDIR /app
|
||||
# Копирование исходного файла в рабочую папку
|
||||
COPY second.py .
|
||||
# Команда запуска
|
||||
CMD ["python", "second.py"]
|
18
polevoy_sergey_lab_2/second/second.py
Normal file
18
polevoy_sergey_lab_2/second/second.py
Normal 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)
|
Loading…
Reference in New Issue
Block a user