首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >treelib在Python3中打印垃圾而不是伪图形

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

Stack Overflow用户
提问于 2017-09-21 13:46:24
回答 2查看 348关注 0票数 1

我在乔木中创建了树,并调用

代码语言:javascript
复制
tree.show()

幸运的是,它没有打印树,而是打印类似于

代码语言:javascript
复制
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之间的不兼容吗?

怎么修?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-21 15:52:40

是个窃听器。

在您的Python安装中,转到Lib\site-packages\treelib并编辑tree.py。找到def show。最后一行是:

代码语言:javascript
复制
print(self.reader.encode('utf-8'))

它应该是:

代码语言:javascript
复制
print(self.reader)

直接打印Unicode字符串应该在控制台的默认编码中对它们进行编码,因此只要控制台支持行绘制字符,它就会打印得很好:

代码语言:javascript
复制
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。

票数 1
EN

Stack Overflow用户

发布于 2017-09-21 15:35:58

在Python3中,我们希望show打印一个字符串。相反,它似乎在打印bytes类型中的对象:字节序列,实际上是以特定字符编码编码的字符串。

在本例中,编码是utf-8。我们可以看到这样的代码:

代码语言:javascript
复制
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。实际上,看看代码,我们可以看到以下一行:

代码语言:javascript
复制
print(self.reader.encode('utf-8'))

这是错误的。向树型开发人员提出一个问题。同时,如果你用:

代码语言:javascript
复制
print(self.reader)

这会管用的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46345677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档