将看似JSON的文件解析为JSON

时间:2016-05-15 12:02:05

标签: python json string parsing

我试图弄清楚这是解决这个问题的最佳方法: 我从某个缓冲区读取文本行,最终创建一个看起来像这样的日志:

>>> 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)

1 个答案:

答案 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"
}