Найти - Пользователи
Полная версия: Получить значения с двух словарей
Начало » Python для новичков » Получить значения с двух словарей
1
Demontager
Есть задача получить значения с двух словарей. Есть значения, которые получаются когда выполняется запрос параметром 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'
Shaman
Предположительно так:
from itertools import chain
for i in chain(response["DEVS"], response["POOLS"]):
    pass
Demontager
А как весь код тогда будет выглядеть ? Я попробовал как ниже, но не работает.
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'
Shaman
{u'devs': [{u'STATUS': [{u'STATUS': u'S',……..
Маленькими.
Demontager
 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
Почти получилось
 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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB