从Python

时间:2016-12-05 22:32:32

标签: python parsing dictionary

我的原始输入文件如下(总计1.3MB)

{         " dataFrame":" AB3hqqqpVVVOAAA =",         "解密":是的,         " fcnt":3,         " id":1480528200533,         " port":5,         " rssi":-116,         " sf_used":10,         " snr":-8.5,         " timestamp":" 2016-11-30T17:50:00.533Z"     },     {         " dataFrame":" AB3hqqqpVVVOAAA =",         "解密":是的,         " fcnt":5,         " id":1480528235613,         " port":5,         " rssi":-119,         " sf_used":10,         " snr":-5.8,         "时间戳":" 2016-11-30T17:50:35.613Z"     },

当我运行infile = json.load(infile)时,我收到如下错误

无法解码JSON对象

它适用于相同数据的一小部分..

2 个答案:

答案 0 :(得分:1)

假设你只需要删除DEBUG:root:部分,其余部分是某种类型的Python文字(没有嵌入的换行符),我建议通过让Python解析文字来简化你的代码,{{ 3}}

有点不清楚你在做什么,所以我无法提供确切的代码;你的行显然是三个冒号分隔的字段(你只跳过一个),其中最后一个字段是list字面(你表现得像一个dict)。

无论哪种方式,一旦你修剪了记录前缀,你就可以这样做:

 value = ast.literal_eval(literal_string)

让Python使用自己的文字解析机制来执行转换。

答案 1 :(得分:0)

通过字典循环将返回键。

d={"a":1, "b":2}
for key in d:
    print(key)

将输出" a"和" b"。

循环决定词的另一种方法是:

d={"a": 1, "b": 2}
for key, val in d.items():
    print(key, val)

在您的代码中,line应仅包含密钥。 我认为您需要将if块更改为:

for line, val in infile.items():
        if line.strip() in keep:
           csvlines.append(val.strip())

上面的代码是python 3.我想在python 2中,而不是items(),你会使用iteritems()

我担心我无法解释keyerror。键应该是字符串,索引应该适用于字符串。 不完全确定为什么会出错。但是在任何情况下,您都不想在字符串键中追加第二个字符,您想要附加属于该键的值。

在使用它之前,你能看一下行吗?

for line in infile:
    print(line) # <------------------- here
    if line[0].strip() in keep:
       csvlines.append(line[1].strip())