Декодировать двоичный файл из xmlrpc python

Я новичок в python и xml-rpc, и я застрял с декодированием двоичных данных, поступающих из публичной службы:

ответ на запрос сервиса с этим кодом:

from xmlrpc.client import Server

import xmlrpc.client  

from pprint import pprint

DEV_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'

logFile = open('stat.txt', 'w')

s1 = Server('http://muovi.roma.it/ws/xml/autenticazione/1')
s2 = Server('http://muovi.roma.it/ws/xml/paline/7')

token = s1.autenticazione.Accedi(DEV_KEY, '')

res = s2.paline.GetStatPassaggi(token)

pprint(res, logFile)

ответ:

{'id_richiesta': '257a369dbf46e41ba275f8c821c7e1e0',
 'risposta': {'periodi_aggregazione': <xmlrpc.client.Binary object at 0x0000027B7D6E2588>,
              'tempi_attesa_percorsi': <xmlrpc.client.Binary object at 0x0000027B7D9276D8>}}

Мне нужно декодировать эти два двоичных объекта, и я застрял с этим кодом:

from xmlrpc.client import Server

import xmlrpc.client  

from pprint import pprint

DEV_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxx'

logFile = open('stat.txt', 'w')

s1 = Server('http://muovi.roma.it/ws/xml/autenticazione/1')
s2 = Server('http://muovi.roma.it/ws/xml/paline/7')

token = s1.autenticazione.Accedi(DEV_KEY, '')

res = s2.paline.GetStatPassaggi(token)

dat = xmlrpc.client.Binary(res)
out = xmlrpc.client.Binary.decode(dat)

pprint(out, logFile)

что заканчивается в:

Traceback (последний вызов был последним): файл "stat.py", строка 18, в файле dat = xmlrpc.client.Binary(res) "C:\Users\Leonardo\AppData\Local\Programs\Python\Python35\lib\xmlrpc\client.py", строка 389, в данных инициализации.классname) TypeError: ожидаемые байты или байтовые массивы, а не dict

Единственный документ, который я нашел для xmlrpc.client, это документ на docs.python.org, но я не могу понять, как я могу декодировать эти двоичные файлы

1 ответ

Если содержание res переменная (что вы получаете от 2- го (s2) server) - это ответ, который вы вставили в вопрос, тогда вам следует изменить последние 3 строки вашего второго фрагмента (так как у вас уже есть 2 Binary объекты в res словарь):

# Existing code
res = s2.paline.GetStatPassaggi(token)

answer = res.get("risposta", dict())
aggregation_periods = answer.get("periodi_aggregazione", xmlrpc.client.Binary())
timeout_paths = answer.get("tempi_attesa_percorsi", xmlrpc.client.Binary())

print(aggregation_periods.data)
print(timeout_paths.data)

Примечания:

  • Согласно [Python]: Бинарные объекты:

    Двоичные объекты имеют следующие методы, поддерживаемые в основном для внутреннего использования кодом маршаллинга / демаршаллинга:

  • Я не смог подключиться (и это проверить решение), так как DEV_KEY (очевидно) подделка
Другие вопросы по тегам