我正在将我的应用程序从Python2迁移到Python3。该应用程序将配置保存到一个文件中,其中一个属性在保存之前被编码为utf-8。
例如:username=‘str’保存为'\xe1\x9a\xa0\xe1\x9b....x9a\xb1‘(转换后的数据类型为ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ)
由于此配置文件将在迁移过程中保留,因此当我尝试检索用户名时,我无法像在python3中那样将其解码回unicode,因为str对象没有属性decode。理想情况下,文件中的保存值应该被视为字节,但由于python2不这样做,因此会产生问题。
我不能将它转换成字节对象,因为它改变了整个字符串,尝试了相同的方法。
无法更改当前应用程序代码,因为它已在生产中。
我试着在字符串之前手动附加b‘,这样就行了。但那只是个小技巧。我试过ast.literal_eval,但还是不起作用。
伪代码目前在Python2上运行良好(在迁移到python3之前):
1. To save value in text file:
fp=open(filename,'w')
encoded_name=name.encode('utf-8')
fp.write(encoded_name)
fp.close()
2. To retrieve:
fp.open(filename, 'r') #or rb
encoded_name=fp.read()
fp.close()
return encoded_name.decode('utf-8) 预期结果:应将从配置文件中检索到的用户名视为字节,而不是字符串。
发布于 2019-04-12 21:15:42
如果您使用
fp.open(filename, 'r')那么你不需要decode任何东西,它已经是unicode字符串了。
但是如果你使用
fp.open(filename, 'rb')应该用encoded_name.decode('utf-8')解码
https://stackoverflow.com/questions/55651990
复制相似问题