我正在尝试解析REST调用的响应。响应头以字典格式返回。最终目标是将所有属性(x-ms-properties的值)解码为字符串。
响应采用格式。
{'Last-Modified': 'Mon, 06 May 2019 09:32:13 GMT', 'ETag': '"0x8D6D205B880F304"', 'Server': 'abc', 'x-ms-properties': 'anotherprop=dGVzdA==,source=YWJj', 'x-ms-namespace-enabled': 'true', 'x-ms-request-id': '45839301-401f-0003-1202-04d929000000', 'x-ms-version': '2018-03-28', 'Date': 'Mon, 06 May 2019 11:54:29 GMT'}
我想解析键x-ms-properties的值。如果看到的话,该值采用键值对的形式。该值是base64编码的。
我可以使用代码静态解码dGVzdA ==值。
import base64
b1="dGVzdA=="
# Decoding the Base64 bytes
d = base64.b64decode(b1)
# Decoding the bytes to string
s2 = d.decode("UTF-8")
print(s2)
但是我该如何解析响应,然后一般地进行呢?
我已经阅读了论坛的帖子,并尝试过
originalresp={'Last-Modified': 'Mon, 06 May 2019 09:32:13 GMT', 'ETag': '"0x8D6D205B880F304"', 'Server': 'abc', 'x-ms-properties': 'anotherprop=dGVzdA==,source=YWJj', 'x-ms-namespace-enabled': 'true', 'x-ms-request-id': '45839301-401f-0003-1202-04d929000000', 'x-ms-version': '2018-03-28', 'Date': 'Mon, 06 May 2019 11:54:29 GMT'}
properties=originalresp["x-ms-properties"]
dict(item.split("=") for item in properties.split(","))
但是当然会失败,因为由于base64编码,我的属性的值中包含“ ==”。
如何获取此密钥的值,然后继续进行解码?
答案 0 :(得分:1)
使用ast
模块
例如:
import ast
originalresp="""{'Last-Modified': 'Mon, 06 May 2019 09:32:13 GMT', 'ETag': '"0x8D6D205B880F304"', 'Server': 'abc', 'x-ms-properties': 'anotherprop=dGVzdA==,source=YWJj', 'x-ms-namespace-enabled': 'true', 'x-ms-request-id': '45839301-401f-0003-1202-04d929000000', 'x-ms-version': '2018-03-28', 'Date': 'Mon, 06 May 2019 11:54:29 GMT'}"""
originalresp = ast.literal_eval(originalresp)
print(originalresp["x-ms-properties"])
输出:
anotherprop=dGVzdA==,source=YWJj
答案 1 :(得分:0)
代码中唯一缺少的是您需要告诉split('=')
仅考虑第一个等号,您可以通过item.split("=",1)
来完成
从文档中:https://docs.python.org/3/library/stdtypes.html#str.split
str.split(sep = None,maxsplit = -1)
使用sep作为分隔符字符串,返回字符串中单词的列表。如果指定了maxsplit,则最多完成maxsplit个拆分(因此,列表中最多包含maxsplit + 1个元素)。
因此,我们进行了更改
originalresp={'Last-Modified': 'Mon, 06 May 2019 09:32:13 GMT', 'ETag': '"0x8D6D205B880F304"', 'Server': 'abc', 'x-ms-properties': 'anotherprop=dGVzdA==,source=YWJj', 'x-ms-namespace-enabled': 'true', 'x-ms-request-id': '45839301-401f-0003-1202-04d929000000', 'x-ms-version': '2018-03-28', 'Date': 'Mon, 06 May 2019 11:54:29 GMT'}
properties=originalresp["x-ms-properties"]
#Changed the split on equals here with maxsplit=1
dct = dict(item.split("=",1) for item in properties.split(","))
print(dct)
输出将为
{'anotherprop': 'dGVzdA==', 'source': 'YWJj'}
现在您的原始代码将按预期工作:)
import base64
# Decoding the Base64 bytes
d = base64.b64decode(dct['anotherprop'])
# Decoding the bytes to string
s2 = d.decode("UTF-8")
print(s2)
输出将为test