Как сохранить \n в шифровании с помощью Python?

В этом простом коде, когда я даю ему текстовый файл, программа шифрует его, а затем расшифровывает, вопрос в том, почему строка if ch != '\n' не работает, а все символы '\n игнорируются, когда файл расшифрован?

# Encryption 
file_location = input('Enter the loaction of your text file: ')

def encrypt_file(paragraphs: list):
output = ''

for ph in paragraphs:
    for ch in ph:
        ASCII_of_ch = ord(ch)
        ASCII_of_ch = int((ASCII_of_ch + 5))
        output += chr(ASCII_of_ch)
        
    return output

with open(file_location, 'r+', encoding='UTF-8') as text_file:
    text_paragraphs = text_file.readlines()
    enc_text = encrypt_file(text_paragraphs)

    text_file.seek(0)
    text_file.write(enc_text)
    print('Done!!')



# Decryption
file_location = input('Enter the loaction of your encrypted file: ')

def decrypt_file(text: str):
   output = ''

    for ch in text:
        ASCII_of_ch = ord(ch)
        ASCII_of_ch = int((ASCII_of_ch - 5))
        output += chr(ASCII_of_ch)
        
    return output

with open(file_location, 'r+', encoding='UTF-8') as text_file:
    file_text = text_file.read()
    enc_text = decrypt_file(file_text)

    text_file.seek(0)
    text_file.write(enc_text)
    print('Done!!')

Когда я пишу:

Привет

Как вы?

Как дела?

после расшифровки получается:

Привет, как дела? Как дела?

🤔 А знаете ли вы, что...
Python используется в разработке игр с помощью библиотеки Pygame.


53
2

Ответы:

Решено

Вы разделяете файл по \n, а это значит, что будут удалены все \n. Также по какой-то причине в вашем коде дважды есть блок with open, и непонятно почему.

Вот более эффективное переписывание вашего кода.

file_location = input('Enter the location of your text file: ')

with open(file_location, 'r+', encoding='UTF-8') as text_file:
    text = text_file.read()
    output = ""
    for ch in text:
        if ch != "\n":
            ch_ascii = ord(ch)
            output += chr(ch_ascii - 5)
        else:
            output += "\n"

print(output)

Вам необходимо внести некоторые изменения в функцию encrypt_file(paragraphs: list). Потому что, когда вы пытаетесь разделить текст с помощью text_file.read().split('\n'), \n из него удаляется.

Теперь я предлагаю создать переменную output, которая будет хранить зашифрованный текст для каждой строки, и когда шифрование одной строки будет завершено, добавьте зашифрованный текст в переменную list и очистите output. Повторите этот процесс для всех строк, и в конце вы можете присоединиться ко всему списку, используя \n, чтобы вернуть зашифрованный текст с помощью \n.

Вот исправленная версия функции:

def encrypt_file(paragraphs: list):
    encrypted_list = []
    
    for ph in paragraphs:
        output = ''
        for ch in ph:
            if ch != '\n':
                ASCII_of_ch = ord(ch)
                ASCII_of_ch = int((ASCII_of_ch + 5))
                output += chr(ASCII_of_ch)
            else:
                output += ch
        encrypted_list.append(output)
    enc_text = '\n'.join(encrypted_list)
    return enc_text

Пожалуйста, одобрите это решение, если вы считаете его полезным.