Merge pull request 'polevoy_sergey_lab_2' (#195) from polevoy_sergey_lab_2 into main
Reviewed-on: #195
This commit is contained in:
commit
22dd0c1a6f
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