用值分隔符分割字符串

时间:2019-05-06 12:34:40

标签: python string dictionary split

我正在尝试解析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编码,我的属性的值中包含“ ==”。

如何获取此密钥的值,然后继续进行解码?

2 个答案:

答案 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