1. 程式人生 > >關於bytes和bytearray

關於bytes和bytearray

remove cls odi load ui5 idt mono icp decode


背景

  • 平時工作因為有批量線上數據進行更新,通過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的繼承類,來進行轉換

?

關於bytes和bytearray