Уведомления

Группа в Telegram: @pythonsu

#1 Май 16, 2014 12:36:43

Demontager
Зарегистрирован: 2014-05-16
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Получить значения с двух словарей

Есть задача получить значения с двух словарей. Есть значения, которые получаются когда выполняется запрос параметром devs и pools, но я не знаю как их объединить. Измененный код такой

import socket
import json
import sys
def linesplit(socket):
	buffer = socket.recv(4096)
	done = False
	while not done:
		more = socket.recv(4096)
		if not more:
			done = True
		else:
			buffer = buffer+more
	if buffer:
		return buffer
api_command = sys.argv[1].split('|')
if len(sys.argv) < 3:
	api_ip = '127.0.0.1'
	api_port = 4028
else:
	api_ip = sys.argv[2]
	api_port = sys.argv[3]
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((api_ip,int(api_port)))
if len(api_command) == 2:
	s.send(json.dumps({"command":api_command[0],"parameter":api_command[1]}))
else:
	s.send(json.dumps({"command":api_command[0]}))
response = linesplit(s)
response = response.replace('\x00','')
response = json.loads(response)
if api_command[0]=="devs+pools":
    j=1
    for i in response["DEVS"+"POOLS"]:
        print j, i["Temperature"], i["MHS 5s"], i["URL"]
        j+=1 
else:
    print response
s.close()
Сама “чистая” команда api.py devs+pools, выводит список значений https://gist.github.com/Demontager/48b4667b7ddf6ff7b85e Оригинальный его код https://gist.github.com/Demontager/c88a4af7fc1cf0978e95
Но когда я пытаюсь выдернуть только необходимые значения, получаю
# python apy.py devs+pools
Traceback (most recent call last):
  File "apy.py", line 38, in <module>
    for i in response["DEVS"+"POOLS"]:
KeyError: 'DEVSPOOLS'

Отредактировано Demontager (Май 16, 2014 12:43:33)

Офлайн

#2 Май 16, 2014 12:49:35

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Получить значения с двух словарей

Предположительно так:

from itertools import chain
for i in chain(response["DEVS"], response["POOLS"]):
    pass

Офлайн

#3 Май 16, 2014 13:09:57

Demontager
Зарегистрирован: 2014-05-16
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Получить значения с двух словарей

А как весь код тогда будет выглядеть ? Я попробовал как ниже, но не работает.

import socket
import json
import sys
def linesplit(socket):
        buffer = socket.recv(4096)
        done = False
        while not done:
                more = socket.recv(4096)
                if not more:
                        done = True
                else:
                        buffer = buffer+more
        if buffer:
                return buffer
api_command = sys.argv[1].split('|')
if len(sys.argv) < 3:
        api_ip = '127.0.0.1'
        api_port = 4028
else:
        api_ip = sys.argv[2]
        api_port = sys.argv[3]
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((api_ip,int(api_port)))
if len(api_command) == 2:
        s.send(json.dumps({"command":api_command[0],"parameter":api_command[1]}))
else:
        s.send(json.dumps({"command":api_command[0]}))
response = linesplit(s)
response = response.replace('\x00','')
response = json.loads(response)
if api_command[0]=="devs+pools":
    j=1
    from itertools import chain
    for i in chain(response["DEVS"], response["POOLS"]):
        print j, i["Temperature"], i["MHS 5s"], i["URL"]
        j+=1
else:
    print response
s.close()
# python apy.py devs+pools
Traceback (most recent call last):
  File "apy.py", line 39, in <module>
    for i in chain(response["DEVS"], response["POOLS"]):
KeyError: 'DEVS'

Отредактировано Demontager (Май 16, 2014 13:10:30)

Офлайн

#4 Май 16, 2014 13:18:43

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Получить значения с двух словарей

{u'devs': [{u'STATUS': [{u'STATUS': u'S',……..
Маленькими.

Офлайн

#5 Май 16, 2014 13:42:23

Demontager
Зарегистрирован: 2014-05-16
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Получить значения с двух словарей

 for i in chain(response["devs"], response["pools"]):
# python apy.py devs+pools
1
Traceback (most recent call last):
  File "apy.py", line 40, in <module>
    print j, i["Temperature"], i["MHS 5s"], i["URL"]
KeyError: 'Temperature'

Значения получается получить если запрашивать один словарь, к примеру devs, но код тогда такой
if api_command[0]=="devs":
    j=1
    for i in response["DEVS"]:
        print j, i["Temperature"], i["MHS 5s"]
        j+=1
Результат
# python apy.py devs
1 73.0 1.4466
2 73.0 1.4491
Но мне нужно получать еще значения с запроса pools

Отредактировано Demontager (Май 16, 2014 13:48:39)

Офлайн

#6 Май 17, 2014 02:19:28

Demontager
Зарегистрирован: 2014-05-16
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Получить значения с двух словарей

Почти получилось

 if api_command[0]=="devs+pools":
    j=1
    for i in range(len(f["devs"][0]["DEVS"])):
        d=f["devs"][0]["DEVS"][i]
        p=f["pools"][0]["POOLS"][i]
        print i, d["Temperature"], d["MHS 5s"], p["URL"]
 else:
    print response
На выходе имеем
0 72.0 1.4447 stratum+tcp://stratum1.suchpool.pw:3335
1 72.0 1.4445 stratum+tcp://stratum2.suchpool.pw:3335

Но тут есть логическая ошибка, получается что показываются все stratum сервера, но нужно чтобы показывался только тот, который идет после {u'Stratum Active': True
Форматированный список значений только запроса pools http://pastebin.com/19ckc6H0

Отредактировано Demontager (Май 17, 2014 02:20:51)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version