如何将此文本文件转换为json?最后,我将json blob插入NoSQL数据库,但是现在我计划解析文本文件并构建一个python dict,然后转储到json。
我认为必须有一种方法可以通过词典理解来实现这一点,我只是没有看到/关注(我是python的新手)。
文件示例:
file_1.txt
[namespace1] => metric_A = value1
[namespace1] => metric_B = value2
[namespace2] => metric_A = value3
[namespace2] => metric_B = value4
[namespace2] => metric_B = value5
我要构建转换为json的dict示例:
{ "file1" : {
"namespace1" : {
"metric_A" : "value_1",
"metric_B" : "value_2"
},
"namespace2" : {
"metric_A" : "value_3",
"metric_B" : ["value4", "value5"]
}
}
我目前有这个工作,但我的代码是一个完全混乱(并且比这个例子更复杂w /清理等)。我基本上会逐行浏览文件,构建一个python dict。我在dict中检查每个命名空间是否存在,如果存在,我检查指标。如果度量已经存在,我知道我有重复项,需要将值转换为包含现有值和新值的数组。必须有一个更简单/干净的方式。
答案 0 :(得分:2)
import glob
import json
answer = {}
for fname in glob.glob(file_*.txt): # loop over all filenames
answer[fname] = {}
with open(fname) as infile:
for line in infile:
line = line.strip()
if not line: continue
splits = line.split()[::2]
splits[0] = splits[0][1:-1]
namespace, metric, value = splits # all the values in the line that we're interested in
answer[fname].get(namespace, {})[metric] = value # populate the dict
required_json = json.dumps(answer) # turn the dict into proper JSON
答案 1 :(得分:1)
您可以使用正则表达式。 re.findall('\w+', line)
将找到您所追求的所有文本组,然后其余文本组将其保存在字典字典中。最简单的方法是使用defaultdict
中的collections
。
import re
from collections import defaultdict
answer = defaultdict(lambda: defaultdict(lambda: []))
with open('file_1.txt', 'r') as f:
for line in f:
namespace, metric, value = re.findall(r'\w+', line)
answer[namespace][metric].append(value)
如我们所知,我们期望正好有3个alphanum组,我们将其分配给3个变量,即namespace, metric, value
。最后,当我们第一次看到命名空间时,defaultdict
将返回defaultdict,而内部defaultdict将返回第一个追加的空数组,使代码更紧凑。