从 Azure 表存储中提取字节值
Posted
技术标签:
【中文标题】从 Azure 表存储中提取字节值【英文标题】:Extracting Byte values from Azure Table Storage 【发布时间】:2021-07-04 10:47:00 【问题描述】:我正在编写一个 python 脚本来从 Azure 表存储中查询数据。
我要提取的数据是二进制类型(信息被序列化并存储)
当我使用 entity['BodyChunk01] 运行代码时,我得到的值返回为
'BodyChunk01': <azure.data.tables._entity.EntityProperty object at 0x0DDFFB10>
(列名是BodyChunk01)
当我使用 entity['BodyChunk01'].value 时,如 *** 上的另一个问题中所述,它返回反序列化的 json 数据,但我想要存储的实际序列化值,如您所见在下面的屏幕截图中
【问题讨论】:
【参考方案1】:我相信你想要完成的事情是不可能的。我查看了SDK代码here
,似乎SDK正在根据代码here
进行强制转换。
def _decode_base64_to_bytes(data):
if isinstance(data, six.text_type):
data = data.encode("utf-8")
return base64.b64decode(data)
您可能想在此处提出问题:https://github.com/Azure/azure-sdk-for-python/issues 并将其告知 SDK 团队。
二进制数据被转换为“Base64 编码字符串”,然后保存。您需要做的是进行 Base64 解码以获取字节数组。我并不精通 Python,但你可以这样做:
import base64
decodedBytes = base64.b64decode(entity['BodyChunk01'].value)
decodedStr = str(decodedBytes, "utf-8")
【讨论】:
谢谢你的回复,但是当我做 entity['BodyChunk01'].value 时,我没有得到像截图中那样的字节字符串,我得到了 json 输出,所以它会自动解码它。但我想要的是截图中的字节数组 哦...可能是我误解了。所以你说的是 SDK 会自动解码内容,你不希望这种情况发生。正确的?您使用的 SDK 是什么? 是的,当我使用 .value 时,它会自动对其进行解码,我不希望这种情况发生,我想要实际的字节数组。我正在为 python 使用 azure.data.tables sdk 更新了我的答案。 HTH。 非常感谢您的详细解答【参考方案2】:如果您希望实体采用原始格式,您可以包含一个不返回 OData 类型的标头,这将通过反序列化传递。 Ints、float、boolean 被转换为它们各自的类型,但二进制实体属性将作为原始字符串返回。这是一个代码sn-p:
headers = 'Accept': 'application/json;odata=nometadata'
received_entity = table_client.get_entity(
row_key=entity['RowKey'],
partition_key=entity['PartitionKey'],
headers=headers
)
print(received_entity['BodyChunk01'])
免责声明:我在 Azure SDK for Python 团队工作
【讨论】:
以上是关于从 Azure 表存储中提取字节值的主要内容,如果未能解决你的问题,请参考以下文章
Blob 存储上的 Azure 触发器,从图像 (Blob) 中提取 EXIF (lat/long/direction...) 数据