胶水Python

Python3 的Byte String引发的问题

2019-01-27  本文已影响8人  爱折腾的大懒猪

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

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

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

于是查看了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)
上一篇下一篇

猜你喜欢

热点阅读