关于bytes和bytearray


背景

  • 平时工作因为有批量线上数据进行更新,通过Python程序连接数据库,利用连接池和gevent的并发性能,处理大量数据。
  • 因为数据方提供的数据表结构中带有varbinary类型字段,并非全部,所以在使用Python程序时,导致报错

    TypeError: Object of type ‘bytes’ is not JSON serializable

经过多方查证了解到关于Python中bytes和bytearray两种类型区别

1. 关于bytearray类型的用法

  • bytearray() 方法返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256
bytearray()
bytearray(整数n)
bytearray(整型可迭代对象) #可迭代tuple list 整型
bytearray(b'字符串')
bytearray(字符串, encoding='utf-8') # 必须指定编码格式

2. bytearray常用方法

方法说明
ba 代表字节数组
ba.clear() 清空
ba.append(n) 追加一个字节(n为0~255的整数)
ba.remove(value) 删除第一个出现的字节,如果没有则产生
ValueError 错误
ba.reverse() 字节顺序进行反转
ba.decode(encoding=’utf-8’) 转为字符串
ba.find(sub[, start[,end]]) 查找子字节串

3 bytes、bytearray与str之间的区别

bytes是byte的序列,而str是unicode的序列。

str 使用encode方法转化为 bytes

bytes通过decode转化为str

  • str转换成bytes:

    字节串bytes、字节数组bytearray是二进制数据组成的序列,其中每个元素由8bit二进制(同1byte,同2位16进制数,同0~255)组成。

    字节数计算机的语言,字符串是人类的语言,他们之间通过编码表形成一一对应关系。

    最小的 ASCII 编码表只需要一位字节,且只占用了其中 [31,127] 的码位;

    str 存储unicodel 6字符(0~65535)

bytes/bytearry = str.encode(encoding="utf-8")

str = bytes/bytearray.decode(encoding="utf-8")
  • encode:编码,decode:解码

4. 在网上找到一种处理json数据为bytearray的方法


import scipy.io as sio
import os
import json
import numpy as np

load_fn = '2%.mat'
load_data = sio.loadmat(load_fn)
print(load_data.keys())

class MyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.ndarray):
            return obj.tolist()
        elif isinstance(obj, bytes):
            return str(obj, encoding='utf-8');
        return json.JSONEncoder.default(self, obj)

save_fn = os.path.splitext(load_fn)[0] + '.json'
file = open(save_fn,'w',encoding='utf-8');
file.write(json.dumps(load_data,cls=MyEncoder,indent=4))
file.close()

该方法适用于整个json为bytearray类型时使用,利用instance和numpy中的nd.array类型来判断对象类型,自定义修改json.dumps的继承类,来进行转换

原文地址:https://www.cnblogs.com/yanguhung/p/10599617.html