【问题标题】:Parsing dictionary type data from text file in Python在 Python 中从文本文件中解析字典类型数据
【发布时间】:2016-12-05 22:32:32
【问题描述】:

我原来的输入文件如下(共1.3MB):

 {
        "dataFrame": "AB3hqqqpVVVOAAA=", 
        "decrypted": true, 
        "fcnt": 3, 
        "id": 1480528200533, 
        "port": 5, 
        "rssi": -116, 
        "sf_used": 10, 
        "snr": -8.5, 
        "timestamp": "2016-11-30T17:50:00.533Z"
    }, 
    {
        "dataFrame": "AB3hqqqpVVVOAAA=", 
        "decrypted": true, 
        "fcnt": 5, 
        "id": 1480528235613, 
        "port": 5, 
        "rssi": -119, 
        "sf_used": 10, 
        "snr": -5.8, 
        "timestamp": "2016-11-30T17:50:35.613Z"
    },

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

**NO JSON object could be decoded**

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

【问题讨论】:

  • 你想做什么?您的代码看起来不错,是否有某种错误?
  • 抱歉,我编辑了我的问题。谢谢
  • 这与原来的问题有很大的不同。最初的问题基本上是询问如何在读入数据后对其进行解析。这个问题询问如何使用 json 模块导入某些内容。请撤消编辑并发布一个单独的问题。在新问题中,请提供一种重现问题的方法:代码和输入。做一个最小的例子,看看哪里出了问题
  • 您发布的代码例如不是正确的 json,因为尾随逗号。但这显然只是实际输入的摘录。请发布我们重现问题所需的所有内容。如果您不能将它们变小,请使用 pastebin 或类似的东西来处理大文件

标签: python parsing dictionary


【解决方案1】:

假设您只需要删除 DEBUG:root: 部分,其余部分是某种 Python 文字(没有嵌入的换行符),我建议通过让 Python 使用 ast.literal_eval 解析文字来简化您的代码。

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

无论哪种方式,一旦你删除了日志记录前缀,你就可以这样做:

 value = ast.literal_eval(literal_string)

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

【讨论】:

  • 您好,我将代码编辑为完整版本。我不确定我需要在哪里使用 ast.literal_eval.. 基本上我试图从文本文件中获取 rssi、dataFrame、time、snr 和 gps 到 CSV。
  • @James:令人困惑的是您声称该文件包含DEBUG:root:[{...,但您的代码在第一个冒号处拆分,并且处理结果0 的索引list。所以看起来你每次都在处理DEBUG(或者大概是INFO/WARNING/ERROR)。 “我在文本文件中的数据部分”是否准确,或者您是否包含了实际上不存在的日志记录?
  • 我目前正在使用 rest API 从服务器获取这些数据,将数据记录到文本文件的文件在最后一行有 logging.debug(JSONresponse),其中 JSONresponse 是请求对象.我是否应该以不同的方式记录数据..?对不起,我真的是 python 新手。
  • @James:需要明确的是,您是直接从服务器的其余 API 解析数据,还是一个单独的脚本获取数据,将其写入磁盘,并且您正在尝试解析日志?日志记录很好,但您(通常)不想将它用于数据序列化。
  • 这是一个单独的脚本,用于获取数据并尝试写入 csv 文件。我修复了脚本中的一些部分,这些部分用于从服务器获取数据,现在我得到了这种格式。请参考修改后的版本
【解决方案2】:

遍历字典将返回键。

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

【讨论】:

  • 如果 line[0].strip() in keep: 和 d.items 出现错误?
  • 你也应该删除索引。只需使用 line.strip()
  • line 是不支持strip的dict obj
  • 我认为 line 应该是一个字符串。您将 json.load 的输出写入 infile -> infile 是一个字典。然后你遍历字典。看看我的回答,如果你遍历一个字典,循环变量将是字典的键。在您的情况下,键是字符串-> 行应该是字符串。你能检查一下吗?
  • 我更新了我的问题,我认为在使用前先看一下 line 是个好主意。
猜你喜欢
  • 2018-12-25
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 2018-10-12
  • 1970-01-01
  • 2018-04-02
  • 2020-06-05
相关资源
最近更新 更多