【问题标题】:parse text file and convert to json and append data from loop解析文本文件并转换为 json 并从循环中追加数据
【发布时间】:2021-10-17 12:25:54
【问题描述】:

我有一个场景,我正在运行生成如下文本文件(demo.txt)数据的命令:

{
  "id" : "aaaaaaaabhikz75nc3wkao54xhuv245ye6zmjhcecralymbjo3hhvh5qtugq",
  "name" : "zsssd",
  "description" : "testfiler",
  "ticket" : null,
  "cId" : "yu2tiwguc45t6t5ej25pfzpevfhpcbbjjxjjvw6wa",
  "createdBy" : null,
  "timeCreated" : null
}{
  "id" : "aaaaaaaabhikz75nc3wkao54xhuv245ye",
  "name" : "klsssd",
  "description" : "testfiler2",
  "ticket" : null,
  "cId" : "yu2tiwguc456wa",
  "createdBy" : null,
  "timeCreated" : 107635378859
}

我想将其转换为 json 并提取有关名称的信息,并在其在每个循环中运行时将 flp (参考下面的代码)值附加到它并将其存储在一个字典中。

以下是我尝试过的

flp = ["modeltf","modeltz"]
for r in flp:
    res = subprocess.call(['java', '-jar','dem.jar', 'dataname', '-o', 'demo.txt', '-f', r])
    with open('demo.txt') as in, with open('demo.json','w') as out:
         json_string = json.dumps(in, default=lambda o: o.__dict__, sort_keys=True, indent=2)

这没有按预期工作,任何线索都会很棒

想要的结果:[{"name" : "zsssd", "flp" : "modeltf"}, {"name" : "klsssd", "flp" : "modeltz"}]

第一个循环为modeltf 运行,接下来它为modeltz 运行

谢谢

编辑

flp = ["modeltf","modeltz"]
for r in flp:
    res = subprocess.call(['java', '-jar','dem.jar', 'dataname', '-o', 'demo.txt', '-f', r])
    with open("namespaces.txt") as f:
        demo = f.read().replace("\n","")
        records = re.findall(r"\{[^\}]*\}", demo)
        dictionaries = [json.loads(r) for r in records] # this creates the dictonary out of the demo.txt file.

现在我正在尝试从列表字典中获取名称,并尝试将其与 flp 项目进行映射以获得此结果。 [{"name" : "zsssd", "flp" : "modeltf"}, {"name" : "klsssd", "flp" : "modeltz"}]

使用:

results = [{"name": name, "flp": flp} for name,flp in zip(names, flp)]

但它不会遍历完整的数据,只输出第一个 dict 项。

【问题讨论】:

  • 字符串“testfiler”和“testfiler2”应该如何从“描述”键移动到“名称”键,以及输入文件中的其他键应该如何不在结果中?没有任何代码尝试这样做。
  • @mkrieger1 我的错,这是一个错字,我已经改正了
  • "这没有按预期工作" 您的实际结果是什么?根据您自己诊断问题的尝试,您认为哪里出了问题?
  • flp 值的重要性是什么?我在你的代码中没有看到任何使用它们的东西。
  • @KarlKnechtel 使用flp 值我正在循环并作为输入传递给子进程调用。我编辑了问题

标签: python json python-3.x


【解决方案1】:
import re
import json

results = []

flp = ["modeltf","modeltz"]
for r in flp:
    res = subprocess.call(['java', '-jar','dem.jar', 'dataname', '-o', 'demo.txt', '-f', r])
    with open("namespaces.txt") as f:
        demo = f.read().replace("\n","")
        records = re.findall(r"\{[^\}]*\}", demo)
        dictionaries = [json.loads(r) for r in records] # this creates the dictonary out of the demo.txt file.

        for dictionary in dictionaries:

            # option 1, return dictionaries with only 'name' and 'flp' keys
            # 
            result = {"name": dictionary.get(name), "flp": r}
            results.append(result)

            # option 2, return the dictionaries with all the keys
            # 
            # dictionary["flp"] = r
            # results.append(dictionary)

【讨论】:

  • 谢谢,它解决了将 txt 文件转换为 JSON 的部分,但对于下一部分它只返回一个映射,它不会遍历循环
  • 好的,我也编辑答案。从 demo.txt 输出中获得字典后,您只需在其中包含“flp”键值,并将它们附加到结果列表中...
  • 如果您只需要“name”和“flp”键,您可以创建一个新字典并附加它而不是加载一个...
  • 更大的数据集(6k 条记录)花费的时间太长
  • 我不明白为什么这个答案应该投反对票......以及为什么你认为它不正确......
猜你喜欢
  • 2021-08-18
  • 2015-10-08
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 2015-10-18
  • 2012-03-06
相关资源
最近更新 更多