CS61a学习疑问:读取文本元素前缀'b'的含义及解决方法
关于urlopen返回结果带'b'前缀的问题解答
嘿,这个问题我刚学Python网络请求的时候也踩过坑!让我给你掰扯清楚:
那个'b'到底是什么意思?
这个b前缀可不是什么奇怪的bug,它是Python用来标记字节(bytes)类型数据的标识。当你用urlopen请求网络上的文本资源时,服务器返回的原始响应是字节流形式——毕竟网络传输的都是二进制数据嘛。所以shakes.read()拿到的是一个bytes对象,你调用split()拆分后,每个元素自然也都是bytes类型,就会带上这个b前缀。
怎么把这个烦人的'b'去掉?
核心操作就是把字节数据**解码(decode)**成我们常用的字符串(str)类型。因为这个莎士比亚的文本是用UTF-8编码的,直接用decode('utf-8')就能搞定:
修改后的代码示例:
>>> shakes = urlopen('http://composingprograms.com/shakespeare.txt') # 先把字节流解码成字符串,再拆分 >>> text = shakes.read().decode('utf-8').split() >>> text[:25] ['A', "MIDSUMMER-NIGHT'S", 'DREAM', 'Now', ...]
额外提醒:
- 为什么要指定
utf-8?因为大多数现代网站和文本资源都用UTF-8编码,这是最通用的选择。如果遇到解码报错的情况,你可以试试其他编码,但这个莎士比亚文本用UTF-8肯定没问题。 - 要是你之后想对这些文本做查找、替换或者正则匹配之类的操作,必须先转成str类型,不然很多字符串方法对bytes对象根本不生效哦。
内容的提问来源于stack exchange,提问作者Shan Zhang
相关产品推荐
相关产品推荐

