我试图弄清楚这是解决这个问题的最佳方法: 我从某个缓冲区读取文本行,最终创建一个看起来像这样的日志:
>>> strings = time.strftime("%Y%m%d")
>>> strings
'20160515'
我想把这个日志中的所有字段都放到一个字典中,我以后可以把它变成一个json文件,日志中的不同部分并不重要,例如,如果myDictionary是python中的字典变量我想要拥有:
Some_Information: here there's some information about date and hour
Additional information: log summary #1234:
details {
name: "John Doe"
address: "myAdress"
phone: 01234567
}
information {
age: 30
height: 1.70
weight: 70
}
会告诉我> myDictionary['age']
。
和所有其他领域相同。
速度非常重要,这就是为什么我想要通过每一行并将其放入字典
我这样做的方法是为包含"的每一行:"冒号我会拆分字符串并获取字典中的键和值。 有更好的方法吗? 是否有足够的python模块?
如果需要更多信息,请告知我们。
编辑: 所以到目前为止,我尝试了一些对我来说效果最好的东西, 我目前正在从一个文件中读取模拟缓冲区的读取
我的代码:
30
导致以下.json:
import json
import shlex
newDict = dict()
with open('log.txt') as f:
for line in f:
try:
line = line.replace(" ", "")
stringSplit = line.split(':')
key = stringSplit[0]
value = stringSplit[1]
value = shlex.split(value)
newDict[key] = value[0]
except:
continue
with open('result.json', 'w') as fp:
json.dump(newDict, fp)
答案 0 :(得分:0)
您还没有准确描述样本输入所需的输出,因此您不想完全清楚您想要做什么。所以我猜测,以下内容仅从包含'{'
的行之后的行中提取数据值,直到遇到其中'}'
的行,而忽略其他行。
它使用re
模块来隔离行上找到的每个字典项定义的两个部分,然后使用ast
模块将其值部分转换为有效的Python文字(即string,number,tuple,list,dict,bool和None
)。
import ast
import json
import re
pat = re.compile(r"""(?P<key>\w+)\s*:\s*(?P<value>.+)$""")
data_dict = {}
with open('log.txt', 'rU') as f:
braces = 0
for line in (line.strip() for line in f):
if braces > 0:
match = pat.search(line)
if match and len(match.groups()) == 2:
key = match.group('key')
value = ast.literal_eval(match.group('value'))
data_dict[key] = value
elif '{' in line:
braces += 1
elif '}' in line:
braces -= 1
else:
pass # ignore line
print(json.dumps(data_dict, indent=4))
示例输入的输出:
{
"name": "John Doe",
"weight": 70,
"age": 30,
"height": 1.7,
"phone": 342391,
"address": "myAdress"
}