Разбить строку с разделителями в значении - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь разобрать ответ на вызов 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-свойств.Если вы видите, значение находится в форме пар ключ-значение.И значение в кодировке 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 ]

1 голос
/ 06 мая 2019

Используйте модуль ast

Ex:

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
0 голосов
/ 06 мая 2019

Единственное, чего не хватает в коде, это указать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...