python中byte2array报错_关于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的继承类,来进行转换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`bytearray()` 是 Python 的一个内置函数,用于创建可变的字节数组对象。它可以接受不同类型的参数,并返回一个字节数组对象。 下面是 `bytearray()` 函数的常用参数说明: - `source`:可选参数,表示初始化字节数组的数据源。它可以是以下几种类型: - 字符串:可以使用字符串作为参数来初始化字节数组。例如,`bytearray("Hello")` 将返回一个包含字符 "Hello" 的字节数组。 - 可迭代对象:可以使用任何可迭代对象作为参数来初始化字节数组。例如,`bytearray([1, 2, 3, 4])` 将返回一个包含整数 1、2、3、4 的字节数组。 - 缓冲区:可以使用缓冲区对象作为参数来初始化字节数组。例如,`bytearray(b'\x01\x02\x03\x04')` 将返回一个包含字节值 0x01、0x02、0x03、0x04 的字节数组。 - `encoding`:可选参数,表示用于解码字符串参数的编码格式。仅当 `source` 参数为字符串时才需要指定该参数。 以下是一些示例,演示了如何使用不同类型的参数来调用 `bytearray()` 函数: ```python # 使用字符串作为参数 ba1 = bytearray("Hello") print(ba1) # 输出: bytearray(b'Hello') # 使用列表作为参数 ba2 = bytearray([1, 2, 3, 4]) print(ba2) # 输出: bytearray(b'\x01\x02\x03\x04') # 使用缓冲区作为参数 ba3 = bytearray(b'\x01\x02\x03\x04') print(ba3) # 输出: bytearray(b'\x01\x02\x03\x04') ``` 在上述示例,我们使用不同类型的参数调用了 `bytearray()` 函数来创建字节数组对象。每个示例的 `print()` 语句用于显示创建的字节数组对象的内容。 请注意,`bytearray()` 函数还可以接受其他参数和关键字参数,具体取决于 Python 版本和环境。你可以参考 Python 官方文档以获取更多关于 `bytearray()` 函数的详细信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值