我在treelib创建了一个树,并调用了
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之间不兼容的东西?
如何解决?
答案 0 :(得分:1)
在Python 3中,我们希望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)
打印正确的树。
这必须是treelib代码中的错误。实际上,查看代码我们可以看到以下行:
print(self.reader.encode('utf-8'))
这是错误的。提出treelib开发人员的问题。在此期间,如果您替换为:
print(self.reader)
这将有效。
答案 1 :(得分:1)
这是一个错误。
在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。