【问题标题】:Python regular expressions (regex), convert JSON to text file for parsingPython正则表达式(regex),将JSON转换为文本文件进行解析
【发布时间】:2019-10-23 15:29:29
【问题描述】:

我用 VGG 注释器注释了一些视频帧,它为我提供JSON 格式的注释,并希望对其进行解析以提取我需要的值(x,y 坐标)。
我查看了该站点上的其他帖子,但似乎没有什么与我的情况相符,因为文件名的长度发生了变化,即。帧编号从 0 到 9,然后从 10 到 99、100 到 999、1000 到 9999,增加一位。

我尝试过import glob 并使用通配符范围、单个字符和星号。

我现在的代码:

#Edited 
while count < 1200:
    x = data[key]['regions']['0']['shape_attributes']['cx']
    y = data[key]['regions']['0']['shape_attributes']['cy']
    pts = (x, y)
    xy.append(pts)
    count += 1

f = open("coordinates.txt", "w")
f.write(xy)
f.close()  

JSON 看起来像:

        "shape_attributes": {
          "name": "point",
          "cx": 400,
          "cy": 121
        },
        "region_attributes": {}
      }
    }
  },
  "frame48.jpg78647": {
    "fileref": "",
    "size": 78647,
    "filename": "frame48.jpg",
    "base64_img_data": "",
    "file_attributes": {},
    "regions": {
      "0": {
        "shape_attributes": {
          "name": "point",
          "cx": 404,
          "cy": 114
        },
        "region_attributes": {}
      }
    }

编辑:我要将 JSON 转换为 .txt 文件并解析它以获取我的值,因为我现在不知道如何直接这样做。

我尝试转换为字符串并按以下方式解析字符串: 这完成了获取 x, y 坐标(3 位整数)的工作,仅附加到一个列表中,我将其转换为 (x,y) 的元组列表并打印到文本文件以供以后用作标签神经网络,我在其中跟踪电视上网球比赛中网球的坐标。

xy.append(re.findall(r'\b\d\d\d\b', datatxt))

【问题讨论】:

  • 看起来您在字典中没有密钥 [f-r]*。你确定你有吗?
  • @balderman 我只是想拿起以 f 开头的密钥,即。 'frame48.jpg78647'。所以基本上我想要通配符,所以它是frame + wc + . + jpg + wc 其中wc 代表通配符。
  • 如果你想从字典中获取一个值,你需要知道确切的键。这就是字典的工作原理。

标签: python regex filenames glob


【解决方案1】:

您不能在字典中使用通配符键。您是否真的关心键 - 是否有您想忽略的条目,或者您很高兴拥有任何/全部?

如果键不重要,则使用data.values(),这将是一个字典列表,您可以浏览其中的前 1,200 个条目。

如果有不符合您提供的格式的键,则遍历它们并首先检查它们是否匹配:

for key in data.keys():
    m = re.match('frame(\d+).jpg(\d+)$', key)
    if not m: continue
    f1, f2 = map(int, m.groups())
    if f1<0 or f1>1199 or f2<10000 or f2>99999: continue
    x = data[key]['regions']['0']['shape_attributes']['cx']
    y = data[key]['regions']['0']['shape_attributes']['cy']
    ...

【讨论】:

  • @M Somerville,我现在想要所有这些。我认为您的答案很可能是正确的,因为我能够为第一个正确的键打印出 `f1 0, f2 39641` 但现在我在0 上遇到了键错误:Traceback (most recent call last): File "parse-json.py", line 20, in &lt;module&gt; x = data[key]['regions']["0"]['shape_attributes']['cx'] KeyError: '0'
  • 该错误告诉您data[key] 字典有一个regions 键,但data[key]['regions'] 字典没有"0" 键。这超出了您的问题范围,如果并非总是如此,您将不得不检查是否存在正确的部分。
  • 看到您的编辑(在这种情况下,请接受答案),您再次尝试在密钥中使用通配符 - 这不起作用。
  • @M Somerville,对不起。您是否碰巧知道为什么带有键 0 的打印语句有效,然后在尝试将值提取到 x 时它在循环中不起作用?
  • 与您提供的信息不符。问题中的 KeyError 是因为您使用的是通配符;你上面的那个 - 你确定你正在打印你在循环中处理的同一行吗?为什么不在循环中打印出正在处理的行并查看其中包含的内容?在出错的代码中进行调试,而不是在可能不匹配的其他地方进行调试。将您的陈述分解成更小的部分,并准确查看哪里出了问题。
猜你喜欢
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
相关资源
最近更新 更多