В этом простом коде, когда я даю ему текстовый файл, программа шифрует его, а затем расшифровывает, вопрос в том, почему строка 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!!')
Когда я пишу:
Привет
Как вы?
Как дела?
после расшифровки получается:
Привет, как дела? Как дела?
Для начала нет смысла разбивать файл на абзацы. Просто зашифруйте text_file.read() напрямую.
Кажется, у вас определены два encrypt_file. Один из них должен был быть decrypt_file?
@JonSG Да, ты прав, забыл изменить имя.
@chepner Вы правы, я хотел продвигать файл по параграфам, чтобы уменьшить использование памяти, но, похоже, мой подход оказался бесполезным. Есть идеи, как это сделать? Если я пройдусь по файлу по параграфам и сохраню результат в отдельном файле, все заработает, не так ли?
Память использовалась сразу после выполнения text_file.read(). Если вы хотите перебирать абзацы, а не строки, вам придется написать свой собственный итератор, который будет читать файл построчно, пока не встретит пустую строку, после чего он выдает прочитанные строки в виде одной строки какой-то.
@chepner Очень ценю это, спасибо.






Вы разделяете файл по \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Пожалуйста, одобрите это решение, если вы считаете его полезным.
@jasonharper, спасибо, я только что понял проблему, есть предложения по ее решению?