您好我正在尝试将一些代码迁移到python 3但是我遇到了以下问题。
Python 2
>>> a = chr(217)
>>> print a, type(a)
� <type 'str'>
Python 3
>>> a = chr(217)
>>> print(a, type(a))
Ù <class 'str'>
原因是我使用以下代码创建了现有数据
from Crypto.Cipher import AES
fle = open("data.dat", "wt")
key = "password000*****"
pwd = AES.new(key, AES.MODE_ECB)
for dat in ("dataname001*****", "dataname002*****"):
txt = ""
hsh = pwd.encrypt(dat)
for c in hsh:
txt = txt + str(ord(c)) + ","
fle.write("%s\n" % txt[:-1])
fle.close()
我需要读取我可以使用python2而不是python3
执行的数据fle = open("data.dat", "rt")
for dat in fle:
txt = ""
for c in dat.split(","):
txt = txt + chr(int(c))
print(pwd.decrypt(txt))
答案 0 :(得分:4)
chr
in Python3.x与unichr
in Python 2.x类似。
如果您需要字节字符串,请使用bytes
:
>>> bytes([217])
b'\xd9'
>>> bytearray([217])
bytearray(b'\xd9')
答案 1 :(得分:1)
是完全重复的。对于&#34;确切&#34;的某些定义。
您看到的差异是:
Python 3中的chr()
实际上是Python 2 unichr()
。这可能是现在正确打印角色的原因。
&#34;类型&#34;在2.2之前的Python中,它是一个古老的东西。 str
类被称为&#34;类型&#34;在Python 2中出于向后兼容性的原因。它现在被称为&#34; class&#34;就像所有其他课程一样。
您还没有看到差异:
str
类并不完全兼容。 Python 3实际上更像是Python 2的unicode
类。但这不是你的例子中的相关差异。答案 2 :(得分:-1)
添加另一个视图,了解它可能无法按预期工作的原因。在Python 3中用作chr
参数的数字应该是Unicode代码点。现在它取决于在写入期间data.dat
内容的编码方式以及在回读时如何解码。
我注意到您正在以文本模式阅读文件。然后,在Python 2中,您可能希望使用标准Python 2模块codecs
来正确读取内容。可能使用codecs.open()
代替普通open()
。