我在乔木中创建了树,并调用
tree.show()幸运的是,它没有打印树,而是打印类似于
b'Hips\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 LeftUpLeg\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 LeftLeg\n\xe2\x94\x82 我见过很多次这样的b-前缀字符串,但不知道它们是什么意思。类似于Python 2和3之间的不兼容吗?
怎么修?
发布于 2017-09-21 15:52:40
是个窃听器。
在您的Python安装中,转到Lib\site-packages\treelib并编辑tree.py。找到def show。最后一行是:
print(self.reader.encode('utf-8'))它应该是:
print(self.reader)直接打印Unicode字符串应该在控制台的默认编码中对它们进行编码,因此只要控制台支持行绘制字符,它就会打印得很好:
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from treelib import Tree
>>> tree=Tree()
>>> tree.create_node('A','a')
Node(tag='A', identifier='a', data=None)
>>> tree.create_node('B','b',parent='a')
Node(tag='B', identifier='b', data=None)
>>> tree.show()
A
└── B这可能不是唯一的窃听器。作者没有遵循程序I/O边界的编码/解码规则,而是在内部使用Unicode。
发布于 2017-09-21 15:35:58
在Python3中,我们希望show打印一个字符串。相反,它似乎在打印bytes类型中的对象:字节序列,实际上是以特定字符编码编码的字符串。
在本例中,编码是utf-8。我们可以看到这样的代码:
import codecs
x = b'Hips\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 LeftUpLeg\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 LeftLeg\n\xe2\x94\x82 '
s = codecs.decode(x,"utf-8")
print(s)打印出正确的树。
这一定是树代码中的一个bug。实际上,看看代码,我们可以看到以下一行:
print(self.reader.encode('utf-8'))这是错误的。向树型开发人员提出一个问题。同时,如果你用:
print(self.reader)这会管用的。
https://stackoverflow.com/questions/46345677
复制相似问题