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