【问题标题】:Extracting Byte values from Azure Table Storage从 Azure 表存储中提取字节值
【发布时间】:2021-07-04 10:47:00
【问题描述】:

我正在编写一个 python 脚本来从 Azure 表存储中查询数据。

我要提取的数据是二进制类型(信息被序列化并存储)

当我使用 entity['BodyChunk01] 运行代码时,我得到的值返回为

'BodyChunk01': <azure.data.tables._entity.EntityProperty object at 0x0DDFFB10>

(列名是BodyChunk01)

当我使用 entity['BodyChunk01'].value 时,如 stackoverflow 上的另一个问题中所述,它返回反序列化的 json 数据,但我想要存储的实际序列化值,如您所见在下面的屏幕截图中

【问题讨论】:

    标签: python azure azure-table-storage azure-tablequery


    【解决方案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 团队工作

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 2012-09-30
      • 1970-01-01
      • 2011-05-18
      • 2019-12-12
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多