You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python加密解密时如何保留换行符\n?换行丢失问题排查

文本加密解密后换行符丢失的问题解决

问题描述

编写的Python文本加密/解密代码运行后,解密结果中原文本的换行符全部消失,多行内容合并为一行。尝试通过判断ch != '\n'跳过换行符加密,但未生效。

问题原因

  1. 换行符被加密为不可打印控制字符:原代码将换行符\n(ASCII 10)加密为ASCII 15的不可打印控制字符,虽解密时能还原为\n,但部分场景下系统或编辑器无法正确识别,导致换行失效。
  2. Windows换行格式未处理:若文件采用Windows系统的\r\n换行格式,原代码会加密\r(ASCII 13)为ASCII 18,解密后变为退格符\b(ASCII 8),破坏换行结构,内容显示为一行。
  3. 文件未截断残留内容:加密/解密后仅用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:34:55