如何在python 3中完全复制python 2 chr

时间:2015-06-10 08:18:18

标签: python python-3.x

您好我正在尝试将一些代码迁移到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))

3 个答案:

答案 0 :(得分:4)

chr in Python3.xunichr in Python 2.x类似。

如果您需要字节字符串,请使用bytes

>>> bytes([217])
b'\xd9'

bytearray

>>> bytearray([217])
bytearray(b'\xd9')

答案 1 :(得分:1)

是完全重复的。对于&#34;确切&#34;的某些定义。

您看到的差异是:

  1. Python 3中的chr()实际上是Python 2 unichr()。这可能是现在正确打印角色的原因。

  2. &#34;类型&#34;在2.2之前的Python中,它是一个古老的东西。 str类被称为&#34;类型&#34;在Python 2中出于向后兼容性的原因。它现在被称为&#34; class&#34;就像所有其他课程一样。

  3. 您还没有看到差异:

    1. Python 2和Python 3 str类并不完全兼容。 Python 3实际上更像是Python 2的unicode类。但这不是你的例子中的相关差异。

答案 2 :(得分:-1)

添加另一个视图,了解它可能无法按预期工作的原因。在Python 3中用作chr参数的数字应该是Unicode代码点。现在它取决于在写入期间data.dat内容的编码方式以及在回读时如何解码。

我注意到您正在以文本模式阅读文件。然后,在Python 2中,您可能希望使用标准Python 2模块codecs来正确读取内容。可能使用codecs.open()代替普通open()