Python加密解密时如何保留换行符\n?换行丢失问题排查
文本加密解密后换行符丢失的问题解决
问题描述
编写的Python文本加密/解密代码运行后,解密结果中原文本的换行符全部消失,多行内容合并为一行。尝试通过判断ch != '\n'跳过换行符加密,但未生效。
问题原因
- 换行符被加密为不可打印控制字符:原代码将换行符
\n(ASCII 10)加密为ASCII 15的不可打印控制字符,虽解密时能还原为\n,但部分场景下系统或编辑器无法正确识别,导致换行失效。 - Windows换行格式未处理:若文件采用Windows系统的
\r\n换行格式,原代码会加密\r(ASCII 13)为ASCII 18,解密后变为退格符\b(ASCII 8),破坏换行结构,内容显示为一行。 - 文件未截断残留内容:加密/解密后仅用
seek(0)覆盖文件开头,未截断原文件多余内容,若原文件长度大于新内容,残留数据会干扰显示。
解决方法
方案一:跳过换行相关字符,不加密
直接保留\n和\r,不对其进行加减ASCII码操作,确保换行结构完整。同时在写入文件后调用truncate()截断多余内容。
修改后的代码
加密代码
file_location = input('请输入文本文件路径:') def encrypt_file(paragraphs: list): output = '' for ph in paragraphs: for ch in ph: # 跳过换行相关字符,直接保留 if ch in ('\n', '\r'): output += ch continue ASCII_of_ch = ord(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) text_file.truncate() # 截断文件,清除多余内容 print('加密完成!')
解密代码
file_location = input('请输入加密文件路径:') def decrypt_file(text: str): output = '' for ch in text: # 跳过换行相关字符,直接保留 if ch in ('\n', '\r'): output += ch continue ASCII_of_ch = ord(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() dec_text = decrypt_file(file_text) text_file.seek(0) text_file.write(dec_text) text_file.truncate() # 截断文件,清除多余内容 print('解密完成!')
方案二:保留所有字符加密,补充文件截断操作
若需对所有字符(包括换行符)进行加密,只需在原代码的写入步骤后添加truncate(),避免残留内容干扰,同时确保解密时能正确还原换行符。
修改后的解密写入部分:
with open(file_location, 'r+', encoding='UTF-8') as text_file: file_text = text_file.read() dec_text = decrypt_file(file_text) text_file.seek(0) text_file.write(dec_text) text_file.truncate() # 添加此行 print('解密完成!')
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

