Python将加密字符串写入文件无变化,求有效解决方案
问题分析与解决方法
核心问题
- 文件指针位置错误:用
r+模式打开文件后,读取完所有内容时,文件指针会停在文件末尾。此时直接写入内容,会把加密后的字符串追加到原文件内容的后面,而非覆盖原内容,导致看起来文件“无变化”(原内容仍保留在文件开头)。 - 文件复制不可靠:
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
相关产品推荐
相关产品推荐

