如何在python 3中精确复制python 2的chr函数

2024-05-08 03:45:47 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我正在尝试将一些代码迁移到Python3,但是遇到了以下问题。在

Python2

>>> a = chr(217)
>>> print a, type(a)
� <type 'str'>

Python3

^{pr2}$

原因是我已经用下面的代码创建了现有的数据

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))

Tags: 代码intxtfordatatypepwdopen
3条回答

那是一个完全的复制品。对于“精确”的某些定义。在

你看到的区别是:

  1. python3中的chr()实际上是python2unichr()。这可能就是现在正确打印字符的原因。

  2. “Types”是Python 2.2之前的一个老东西。由于向后兼容性的原因,str类在python2中被称为“type”。它现在被称为“类”,就像所有其他类一样。

还有一个你看不到的区别:

  1. python2和python3str类并不完全兼容。Python3实际上更像Python2的unicode类。但这在你的例子中并不是一个相关的区别。在

添加另一个观点,说明为什么它可能无法按预期工作。python3中用作chr参数的数字应该是Unicode代码点。现在它取决于data.dat内容在写入过程中是如何编码的,以及在读回时是如何解码的。在

我注意到,您正在以文本模式读取文件。然后,在Python2中,您可能需要使用标准的Python2模块^{}来正确地读取内容。可能,使用^{}代替普通的open()。在

^{} in Python3.x与{a2}相似。在

如果需要字节字符串,请使用^{}

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

^{}

^{pr2}$

相关问题 更多 >