Python3字节串解码错误[TypeError: must be str, not bytes]及兼容问题
Python 3.6兼容Python 2.7字节串代码的问题解决
嘿,这个坑我帮好多人踩过!Python 2和3在字符串/字节串的处理上的差异,绝对是迁移代码时最容易掉进去的陷阱之一。
问题根源
你看,在Python 2里,''定义的是字节串,和open('rb')读出来的line(同样是字节串)直接拼接完全没问题。但到了Python 3,''是Unicode字符串,而rb模式读取的内容是bytes类型——这俩是完全不同的类型,直接拼接就会抛出TypeError: can only concatenate str (not "bytes") to str,这就是你遇到的错误。
快速修复方案
最简单的修改就是把初始的buff改成字节串类型:
import numpy as np buff = b'' # 把空字符串改成空字节串 dt = np.dtype([('var1', np.uint32, 1), ('var2', np.uint8, 1)]) with open(filename, 'rb') as f: for line in f: dat = line buff += dat data = np.frombuffer(buffer=buff, dtype=dt)
更高效的优化方案
如果你的.dat文件不是特别大,其实没必要逐行拼接,直接一次性读取整个文件的字节内容,既简洁又能避免循环拼接的性能损耗:
import numpy as np dt = np.dtype([('var1', np.uint32, 1), ('var2', np.uint8, 1)]) with open(filename, 'rb') as f: buff = f.read() # 一次性读取全部字节数据 data = np.frombuffer(buffer=buff, dtype=dt)
补充说明
Python 3把字符串和字节串严格区分开,是为了明确文本数据和二进制数据的边界,避免Python 2里经常出现的编码混乱问题。以后处理二进制文件(比如.dat、图片、音频这类)时,记得始终用bytes类型来存储和操作读取到的内容哦。
内容的提问来源于stack exchange,提问作者Thiago Gouvea
相关产品推荐
相关产品推荐

