【发布时间】:2018-09-10 09:54:04
【问题描述】:
我需要在 python 中保存一个 params 文件,这个 params 文件包含一些我不会保留在纯文本中的参数,所以我将整个文件编码为 base64(我知道这不是最安全的编码世界,但它适用于我需要使用的那种数据)。
使用编码,一切正常。我对文件的内容(一个带有适当扩展名的简单 txt)进行编码并保存文件。问题与解码有关。我在保存文件之前打印了编码的文本和从保存的文件中编码的文本,并且完全相同,但是由于我不知道的原因,保存的文件文本的解码返回了这个错误UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8d in position 1: invalid start byte并且在保存文件之前对文本的解码效果很好。
有解决这个问题的办法吗?
这是我的代码,我已尝试将所有内容转换为字节、字符串和所有内容......
params = open('params.bpr','r').read()
paramsencoded = base64.b64encode(bytes(params,'utf-8'))
print(paramsencoded)
paramsdecoded = str(base64.b64decode(str(paramsencoded,'utf-8')),'utf-8')
newparams = open('paramsencoded.bpr','w+',encoding='utf-8')
newparams.write(str(paramsencoded))
newparams.close()
params2 = open('paramsencoded.bpr',encoding='utf-8').read()
print(params2)
paramsdecoded = str(base64.b64decode(str(paramsencoded,'utf-8')),'utf-8')
paramsdecoded = base64.b64decode(str(params2))
print(str(paramsdecoded,'utf-8'))
【问题讨论】:
-
您不需要在每次解码 Base64 数据时都将
paramsencoded字节值解码为字符串。b64decode()也接受字节。 -
而不是作为文本读取(使用
'r')然后编码为字节,为什么不将文件读取为二进制(使用'rb'作为模式)? -
我不知道您为什么将
paramsencoded.bpr的文件打开为'w+'?你只需要写,不需要读,所以+可以被删除。同样的说明:以二进制模式打开并直接将bytes值写入str,而无需先解码。 -
最后但并非最不重要的一点,您能否给我们一个重现问题的示例
params值? -
当您从
open('paramsencoded.bpr',encoding='utf-8').read()调用中读取文本时,无需使用str(params2)。最后一行的UnicodeDecodeError到底在哪里抛出?
标签: python encoding base64 decoding