zoukankan      html  css  js  c++  java
  • 关于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的继承类,来进行转换

  • 相关阅读:
    Java中的监听器
    html中的meta元素及viewport属性值
    映射Xml文件中的数据到JavaBean中
    Java中关于Servlet中请求中文乱码及文件下载
    Java中的集合框架-Collections和Arrays
    Java中的集合框架-Map
    Java中的集合框架-Collection(二)
    Java中的IO流(六)
    迭代器和生成器的用法
    (爬虫)requests库
  • 原文地址:https://www.cnblogs.com/yanguhung/p/10599617.html
Copyright © 2011-2022 走看看