Как сохранить \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!!')

Когда я пишу:

Привет

Как вы?

Как дела?

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

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

@jasonharper, спасибо, я только что понял проблему, есть предложения по ее решению?

Anonymous 04.09.2024 21:32

Для начала нет смысла разбивать файл на абзацы. Просто зашифруйте text_file.read() напрямую.

chepner 04.09.2024 22:01

Кажется, у вас определены два encrypt_file. Один из них должен был быть decrypt_file?

JonSG 04.09.2024 22:05

@JonSG Да, ты прав, забыл изменить имя.

Anonymous 06.09.2024 19:02

@chepner Вы правы, я хотел продвигать файл по параграфам, чтобы уменьшить использование памяти, но, похоже, мой подход оказался бесполезным. Есть идеи, как это сделать? Если я пройдусь по файлу по параграфам и сохраню результат в отдельном файле, все заработает, не так ли?

Anonymous 06.09.2024 19:03

Память использовалась сразу после выполнения text_file.read(). Если вы хотите перебирать абзацы, а не строки, вам придется написать свой собственный итератор, который будет читать файл построчно, пока не встретит пустую строку, после чего он выдает прочитанные строки в виде одной строки какой-то.

chepner 06.09.2024 19:13

@chepner Очень ценю это, спасибо.

Anonymous 06.09.2024 20:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)

Огромное спасибо, я сделал это, потому что хотел продвигать файл по параграфам, чтобы уменьшить использование памяти, но, похоже, мой подход оказался бесполезным. Есть идеи, как это сделать? Если я пройдусь по файлу по параграфам и сохраню результат в отдельном файле, все заработает, не так ли?

Anonymous 06.09.2024 19:05

Вам необходимо внести некоторые изменения в функцию 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

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

Другие вопросы по теме