这与Python creating dynamic global variable from list类似,但我仍感到困惑。
我以半专有格式获得了大量的flo数据。我已经使用Python将数据剥离到我的需要,并将数据保存到名为badactor.json
的json文件中,并以下列格式保存:
[saddr as a integer, daddr as a integer, port, date as Julian, time as decimal number]
任意示例[1053464536, 1232644361, 2222, 2014260, 15009]
我想查看我的每周/每月flo日志,并按照Julian日期保存所有内容。首先,我想查看日志并创建一个根据发生的Julian日期命名的列表,即2014260
,然后将其保存为同名2014260.json
。我有以下内容,但它给了我一个错误:
#!/usr/bin/python
import sys
import json
import time
from datetime import datetime
import calendar
#these are varibles I've had to use throughout, kinda a boiler plate for now
x=0
templist2 = []
templist3 = []
templist4 = []
templist5 = []
bad = {}
#this is my list of "bad actors", list is in the following format
#[saddr as a integer, daddr as a integer, port, date as Julian, time as decimal number]
#or an arbitrary example [1053464536, 1232644361, 2222, 2014260, 15009]
badactor = 'badactor.json'
with open(badactor, 'r') as f1:
badact = json.load(f1)
f1.close()
for i in badact:
print i[3] #troubleshooting to verify my value is being read in
tmp = str(i[3])
print tmp#again just troubleshooting
tl=[i[0],i[4],i[1],i[2]]
bad[tmp]=bad[tmp]+tl
print bad[tmp]
尝试创建变量会给我以下错误:
Traceback (most recent call last):
File "savetofiles.py", line 39, in <module>
bad[tmp]=bad[tmp]+tl
KeyError: '2014260'
答案 0 :(得分:2)
当您的代码执行时,“坏”字典中没有键“2014260”。
你的问题在这里:
bad[tmp]=bad[tmp]+tl
你说“将t1添加到不存在的东西。”
相反,您似乎想要这样做:
bad[tmp]=tl
答案 1 :(得分:0)
我建议您将bad
初始化为空collections.defaultdict
而不是常规内置dict
。即。
import collections
...
bad = collections.defaultdict(list)
这样,第一次遇到日期键时,将自动为您创建初始空list
值,并且您从bad[tmp]=bad[tmp]+tl
语句中获得的错误将会消失,因为它会有效变为bad[tmp]=list()+tl
- list()
调用刚创建并返回空列表 - 第一次遇到特定日期。
还不清楚您是否真的需要tmp = str(i[3])
转换,因为任何非可变类型的值都是有效的字典(或defaultdict
)键,而不仅仅是字符串 - 假设i[3]
不是已经是一个字符串了。无论如何,如果您将结果命名为其他代码,后续代码将更具可读性,例如julian_date = i[3]
(如果确实需要转换,则为julian_date = str(i[3])
)。