如何使用rstrip移除Fernet解密字符串前2字符?解决SyntaxError报错
问题根因
Fernet.decrypt()返回值是bytes字节类型,打印时看到的b'前缀是Python解释器显示字节类型的标记,不属于解密结果的实际内容,不需要也不应该用字符截取的方式删除。- 触发语法错误的原因是最后一行f-string写法完全不符合语法规则:单引号嵌套未正确转义、括号/方括号数量不匹配。
- 对
rstrip()方法的功能理解错误:rstrip()仅用于删除字符串/字节串末尾的匹配字符,无法处理开头内容;且传入b'message'作为参数只会删除末尾连续的m/e/s/a/g字符,和预期效果完全无关。 - 额外代码问题:打印加密字符串的语句多套了一层括号,会输出元组格式而非正常文本。
正确实现
直接对解密得到的字节串调用decode()转成普通字符串即可,不会带任何b'前缀,也不会损坏原始内容:
from cryptography.fernet import Fernet from test2 import display file = 'Fernet' message = display key = Fernet.generate_key() fernet = Fernet(key) encMessage = fernet.encrypt(message.encode()) decMessage = fernet.decrypt(encMessage).decode() print("key: ", key) print("Original string: ", message) print("encrypted string: ", encMessage) print(f"decrypted string: {decMessage}")
关于「移除前2个字符」写法的说明
如果只是想了解截取前2个字符的语法(再次强调:这个场景下用截取字符的方式处理b前缀是完全错误的做法,会损坏内容、引入额外bug),Python中截取字符串/字节串前N个字符之后的内容用切片语法[N:]即可,不需要用rstrip:
# 仅作语法演示,请勿在本加解密场景实际使用 demo_bytes = b"test content" cut_result = demo_bytes[2:] # 得到b"st content"
之前写的报错行存在几个明确语法问题:
- f-string外层用单引号包裹,内部写
b'message'时未转义单引号,导致字符串提前闭合 - 末尾多写了
]、)闭合符号,括号层级不匹配 - f-string中引用变量需要放在
{}内,原写法中[decMessage.xxx]没有加花括号,不会被解析为变量
内容的提问来源于stack exchange,提问作者Shadow
相关产品推荐
相关产品推荐

