Python3 的Byte String引发的问题

今天测试使用 NGLview, 然后发现, 昨天在用Anaconda2的时候还好好的, 怎么今天新装了Anaconda3就不行了呢?? 还去官方Github Issue了问题.. 没有相关...

后来试了一堆新建环境, 例如不同版本的python, 不同版本的ipywidgetswidgetsnbextension, 不同版本的nglview, 只要在Py2都OK, Py3都不行..

后来在看一个帖子时, 建议使用nv.demo() 来测试, 而不是官网展示的例子. 于是试了一下, 成功了. 黑人问号脸....

77550-fd89f2fe769000ce.png

于是查看了PdbIdStructuredemo的源码, 并测试了其返回的字符串, 发现了前者获得字符串是b'.....', 而后者是普通字符串. 因为新从Py2转Py3, 不知道何问题, 于是找了一下...

原来, Python3里面有Byte这种类型, byte string是Py2默认的字符串, 而unicode string才是Py3的默认字符串. 在PdbIdStructure里面, 用了urlopen(url).read() 获取文件内容, 返回的就是byte string (为了向下支持?)

好吧, 那就把这个返回的Byte string转为Unicode型就好了. 于是问题成果解决!

## 原来返回Byte的代码
return urlopen(url).read()
## 转为Unicode String
return urlopen(url).read().decode("utf-8")
## 或者
return str(urlopen(url).read(), encoding='utf-8')

好了, 折腾了我一天.... 时间就是金钱啊!!!!

小记:

# bytes object
b = b"example"
 
# str object
s = "example"
 
# str to bytes
bytes(s, encoding = "utf8")
 
# bytes to str
str(b, encoding = "utf-8")
 
# an alternative method
# str to bytes
str.encode(s)
 
# bytes to str
bytes.decode(b)

猜你喜欢

转载自blog.csdn.net/weixin_33981932/article/details/87015218
今日推荐