【发布时间】:2019-08-04 02:43:13
【问题描述】:
我正在尝试使用 JSON 作为数据结构来存储来自 API 的值,最终目标是能够稍后调用此数据并将其用于我平台的其他方面。当前的问题是,当我将计数变量添加到列表中时,我将其转换为字符串并转储到 json 文件,但出现错误,但是当我完全删除计数变量并转储列表时,它可以正常工作,直到我尝试解码它,我尝试使用列表,因为它更容易(在我看来)将数据附加到它,因为它是一个微服务,但我确实理解字典效率更高,但我也无法让它们工作。
代码有效,除非我添加计数变量,例如 n = 0 |计数 = str(n + 1)。在下面的代码中,有一些变量,如throttle api 等,它们在上面定义了静态值,可以在设置模块中更改,即throttleApi = 30 (sec for the timer.sleep function),并且也定义了代币余额。
def add_entry(count,balance_list, Token1_balances, Token2_balances, Token3_balances,localtime):
# check if in seen set
if (count,Token1_balances, Token2_balances, Token3_balances,localtime) in seen:
return balance_list
# add to seen set
seen.add(tuple([count,Token1_balances, Token2_balances, Token3_balances,localtime]))
# append to results list
balance_list.append({'count':count,Token1: Token1_balances, Token2: Token2_balances, Token3: Token3_balances,'time':localtime})
return balance_list
def write_to_json(lst, fn):
with open(fn, 'a', encoding='utf-8') as file:
for item in lst:
x = json.dumps(item, indent=4)
file.write(x + '\n')
balance_list = []
seen = set()
if __name__ == '__main__':
print('-'*40)
print(" Service Online and logging file has been established")
print('-'*40)
n = 0
while True:
time.sleep(throttleClient)
localtime = time.asctime( time.localtime(time.time()) )
minute = datetime.datetime.now().minute
print('Local current time:',localtime,'CDT\n')
if minute % throttleApi == 0:
try:
count = str(n + 1)
balance_query = p2p.getBalances()["result"]
Token1_balances = str(balance_query[Token1])
Token2_balances = str(balance_query[Token2])
Token3_balances = str(balance_query[Token3])
args1 = [count,Token1_balances, Token2_balances, Token3_balances,localtime]
balance_list = add_entry(balance_list, *args1) # add entry - SUCCESS
write_to_json(balance_list, 'balance.json')
except requests.exceptions.ConnectionError as e:
print(ConnectionError)
print('-'*20)
print("Can't log balances due to connection error")
pass
else:
pass
我期待得到
{
"count":"1",
"BTC": "{'available': '0.00524973', 'freeze': '0'}",
"ETH": "{'available': '0', 'freeze': '0'}",
"1SG": "{'available': '15.57', 'freeze': '0'}",
"time": "Sat Aug 3 16:08:04 2019"
}
等等,但我得到了 1) 上面没有计数的数据 或 2)
File "balance_logging.py", line 105, in <module>
balance_list = add_entry(balance_list, *args1) # add entry - SUCCESS
File "balance_logging.py", line 56, in add_entry
if (count,Token1_balances, Token2_balances, Token3_balances,localtime) in seen:
TypeError: unhashable type: 'list'
【问题讨论】:
-
我也可能做错了,因为目标是能够加载这些数据并对其进行迭代,但是这些数据每天会创建几千条记录。
-
您对
add_entry的调用可互换count和balance_list。 (为什么那个函数会返回任何东西呢?) -
老实说,我是 python 新手,不完全确定为什么我在那里返回列表但它似乎有效,你将如何通过删除返回来处理它?我想我现在记得了,如果您在我调用 write_to_json(balance_list,'balance_list.json') 的代码中看到较低的位置,我试图避免重复条目,但我仍然得到重复项。
-
我已经添加了更改并且它可以工作,除了计数它每次只将“1”记录到 json 文件中。
-
集合不能包含列表。
标签: python json python-3.x