treelib在Python3中打印垃圾而不是伪图

时间:2017-09-21 13:46:24

标签: string python-3.x unicode

我在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之间不兼容的东西?

如何解决?

2 个答案:

答案 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。