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

Python将加密字符串写入文件无变化,求有效解决方案

问题分析与解决方法

核心问题

  1. 文件指针位置错误:用r+模式打开文件后,读取完所有内容时,文件指针会停在文件末尾。此时直接写入内容,会把加密后的字符串追加到原文件内容的后面,而非覆盖原内容,导致看起来文件“无变化”(原内容仍保留在文件开头)。
  2. 文件复制不可靠:os.popen('copy ...')依赖系统命令,且未等待复制操作完成就开始读取文件,可能导致读取到空文件或不完整的文件。

解决步骤

1. 替换可靠的文件复制方法

使用Python标准库的shutil.copy代替os.popen,它跨平台且能确保复制完成后再执行后续操作:

import shutil
shutil.copy("RomeoAndJuliet.txt", "SecretRomeoAndJuliet.txt")

2. 修复文件写入逻辑

有两种可行方案:

方案一:分两次打开文件(推荐)

先以只读模式读取文件内容并加密,之后以写入模式(w)打开文件,清空原内容并写入加密后的字符串:

import random
import shutil

alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
# 简化密码表生成
random_alphabet = random.sample(alphabet, 26)
cipher = dict(zip(alphabet, random_alphabet))

# 复制文件
shutil.copy("RomeoAndJuliet.txt", "SecretRomeoAndJuliet.txt")

# 读取文件内容并加密
encrypted_content = ""
with open("SecretRomeoAndJuliet.txt", 'r', encoding="UTF-8") as f:
    for line in f:
        newline = ""
        for letter in line:
            # 直接通过字母查找密文,避免循环遍历字典
            if letter.upper() in cipher:
                # 保留原字符的大小写
                newline += cipher[letter] if letter.isupper() else cipher[letter.upper()].lower()
            else:
                newline += letter
        encrypted_content += newline

# 写入加密后的内容(w模式会自动清空文件)
with open("SecretRomeoAndJuliet.txt", 'w', encoding="UTF-8") as f:
    f.write(encrypted_content)

方案二:使用r+模式时调整文件指针

如果坚持用r+模式,需要在写入前将文件指针移到开头,并截断文件清空原内容:

import random
import shutil

alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
random_alphabet = random.sample(alphabet, 26)
cipher = dict(zip(alphabet, random_alphabet))

shutil.copy("RomeoAndJuliet.txt", "SecretRomeoAndJuliet.txt")

with open("SecretRomeoAndJuliet.txt", 'r+', encoding="UTF-8") as f:
    encrypted_content = ""
    for line in f:
        newline = ""
        for letter in line:
            if letter.upper() in cipher:
                newline += cipher[letter.upper()] if letter.isupper() else cipher[letter.upper()].lower()
            else:
                newline += letter
        encrypted_content += newline
    
    # 将文件指针移到文件开头
    f.seek(0)
    # 截断文件,清空原内容
    f.truncate()
    # 写入加密后的内容
    f.write(encrypted_content)

额外优化

  • 简化了密码表生成:用dict(zip(alphabet, random_alphabet))直接生成映射,无需手动初始化每个键。
  • 优化加密逻辑:直接通过字符查找密码表,避免循环遍历整个字典,提升运行效率。
  • 保留原字符大小写:原代码会统一转为大写,现在根据原字符的大小写返回对应格式的密文。

内容的提问来源于stack exchange,提问作者Jae

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:45:27