如何使用Python从AWS DynamoDB访问并打印二进制字符串类型数据
解决DynamoDB中二进制加密数据的Python访问问题
看起来你在处理DynamoDB里的二进制加密数据时遇到了小麻烦,我来帮你捋一捋。首先看你的代码和遇到的问题:你能成功从表中获取到item,但直接打印dec_otp只显示Tr...,还误以为没法赋值——其实这大概率是Python对二进制数据的默认显示逻辑,以及DynamoDB返回数据类型的特性导致的。
先给你拆解下问题和解决步骤:
1. 先搞清楚返回的otp是什么类型
你已经加了print(type(dec_otp)),先看这个输出:
- 如果输出是
<class 'bytes'>:这是DynamoDB存储二进制(B类型)数据时boto3默认返回的类型,赋值是完全正常的,你觉得无法赋值可能是没验证——比如可以试试print(len(a)),肯定能输出数据的字节长度,证明赋值成功了。而打印显示Tr...是Python的默认行为:当bytes对象太长时,会自动截断中间内容,只显示开头和结尾,不是“无法打印”。 - 如果输出是
<class 'botocore.response.StreamingBody'>:这说明存储的是大二进制对象,boto3返回了一个流对象,需要先读取才能拿到实际的字节数据。
2. 对应场景的解决方案
场景一:返回的是bytes类型
- 要完整查看数据:直接打印bytes会截断,你可以转成base64编码的字符串,这样是可读的:
import base64 print(base64.b64encode(dec_otp).decode('utf-8')) - 解密操作:把这个bytes对象传入你之前加密时用的解密函数(比如AES解密),就能得到原始数据了。
- 关于赋值:
a = dec_otp是有效的,你可以通过print(len(a))或者print(base64.b64encode(a).decode('utf-8'))来验证。
场景二:返回的是StreamingBody类型
这种情况需要先读取流中的数据,再进行后续操作:
# 读取流中的字节数据 dec_otp_bytes = dec_otp.read() # 现在可以正常赋值 a = dec_otp_bytes # 打印可读的base64字符串 print(base64.b64encode(dec_otp_bytes).decode('utf-8')) # 后续解密操作用dec_otp_bytes即可
另外,你可以试试打印item时看看otp字段的显示,DynamoDB的item输出里二进制数据也会用base64或者截断的方式展示,这都是正常的。
内容的提问来源于stack exchange,提问作者vinit jha
相关产品推荐
相关产品推荐

