Подскажите как сделать так, что бы моя программа позволяла указывать пользователем путь к файлу
import os
import sys
def start():
while True:
choise = (int (input('1,2,3\n')))
if choise == 1: #если ввели 1 вызывает функцию crypt
crypt()
if choise == 2: #если ввели 2 вызывает функцию deCrypt
deCrypt()
if choise == 3:
break
def crypt(print=None):
degree = int(input('введите 1/2/4/8\n')) # ввод степени шифрования
text_len = os.stat('start_text.txt').st_size # узнаем размер тектового файла
img_len = os.stat('start_image.bmp').st_size # узнаем размер изображения
if text_len >= img_len*degree/8-54: # проверка вместимости текста
return ['Слишком длинный текст!',]
else:
text = open('start_text.txt','r' ) #открываем текстовый файл на чтение
start_bmp = open('start_image.bmp', 'rb') #открываем изображение на чтение побитово
encode_bmp = open('finish_image.bmp', 'wb')#открываем изображение на запись побитово
first54 = start_bmp.read(54) #считываем первые 54 бита со стартового файла
encode_bmp.write(first54) #записываем информацию о файле
text_mask, img_mask = create_masks(degree) #создание масок
while True:
symbol = text.read(1) # происходит чтение посимвольно
if not symbol:
break #если символы закончились выйти из цикла
symbol = ord(symbol) # преобразовываем букву в ее числовой код
for byte_amount in range(0, 8, degree):
img_byte = int.from_bytes(start_bmp.read(1), sys.byteorder) & img_mask #логическое умножение битового значения символа и маски изображения
bits = symbol & text_mask #логическое умножение кода символа и маски текста
bits >>= (8 - degree) #сдвиг
img_byte |= bits #логическое сложение
encode_bmp.write(img_byte.to_bytes(1, sys.byteorder)) #запись в картинку по одному байту
symbol <<= degree #сдвиг на degree
encode_bmp.write(start_bmp.read()) #запись в картинку
text.close() #закрыть файл
start_bmp.close() #закрыть файл
encode_bmp.close()#закрыть файл
print("Шифрование завершено успешно!")
def create_masks(degree):
text_mask = 0b11111111 #маска текста
img_mask = 0b11111111 #маска изображения
text_mask <<= (8 - degree)
text_mask %= 256
img_mask >>= degree
img_mask <<= degree #обнуляем последнее количество битов равных значению degree
return text_mask, img_mask
def deCrypt():
degree = int(input('enter 1/2/4/8\n')) #ввод степени шифрования
symbs = (int(input("введите количество символов для чтения:")))
to_read = symbs
img_len = os.stat('finish_image.bmp').st_size #находим размер готового изображения
if to_read >= img_len*degree/8-54: #проверка вместимости текста
return ['Too long text!',]
text = open('finish_text.txt', 'w') #открывае текст на запись
encoded_bmp = open('finish_image.bmp', 'rb') #открываем изображение на чтение побитово
encoded_bmp.seek(54)# перемещение курсора на 54 символ
img_mask = create_mask(degree) #находим маску
img_mask = ~img_mask #меняет значения маски на обратные
read = 0
while read < to_read:
symbol = 0
for bits_read in range(0, 8, degree):
img_byte = int.from_bytes(encoded_bmp.read(1), sys.byteorder) & img_mask #логическое умножение первого байта картинки и маски изображения
symbol <<= degree
symbol |= img_byte #логическое сложение
read += 1
text.write(chr(symbol)) # записываем символы в текстовый файл
text.close() #закрываем файл
encoded_bmp.close() #закрываем файл
print("Расшифровка завершена успешно!")
def create_mask(degree):
img_mask = 0b11111111 #маска текста
img_mask >>= degree # обнуляем последние элементы маски
img_mask <<= degree
return img_mask
start()