【问题标题】:Python TypeError with for logic iterating data values用于逻辑迭代数据值的 Python TypeError
【发布时间】:2017-03-24 22:54:04
【问题描述】:

我在让json.load() 函数的for 循环读取“alarmst”字段并带回它们的值时遇到问题。

我在问题代码上方有工作代码,可以很好地使用相同的数据获取“标签”字段数据值。

我认为这可能与 dataStatusdataStart 具有带分号的时间格式化数据有关,即 (2015-12-10T05:59:03Z) 所以我不确定如何解析这些数据或替换循环中的值中的字符在运行 writerow() 函数之前,或者如果有人知道更好的方法来告诉它这些特定字段的值的数据类型是 Date 或类似 Python 的明确类型。

没有额外的“alarmst”循环和日期格式数据的工作代码

import json
import csv

with open('C:\\folder\\dev\\Tags.txt',"r") as file:
    data = json.load(file)

with open('C:\\folder\\dev\\Tags.csv',"w",newline='') as file:

    csv_file = csv.writer(file)
    for dev in data["devs"]:
        for tag in dev["tags"]:
            csv_file.writerow([tag['id'], tag['name'], tag['dataType'], tag['description'], tag['alarm'], tag['value'], tag['quality'], tag['DevTagId']])

有错误的问题代码

import json
import csv

with open('C:\\folder\\dev\\TagAlarms.txt',"r") as file:
    data = json.load(file)

with open('C:\\folder\\dev\\TagAlarms.csv',"w",newline='') as file:
    csv_file = csv.writer(file)
    for dev in data["devs"]:
        for tag in dev["tags"]:
            for alarm in tag["alarmst"]:
                csv_file.writerow(alarm['dateStatus'],[alarm['dateStart'], alarm['status'], alarm['type']])

错误

    csv_file.writerow(alarm['dateStatus'], [alarm['dateStart'], alarm['status'], alarm['type']])
TypeError: string indices must be integers

样本数据

{
  "success": true,
  "moreDataAvailable": true,
  "devs": [
    {
      "id": 111111,
      "name": "dev123",
      "tags": [         
        {
          "id": 10100,
          "name": "CleanTask",
          "dataType": "Bool",
          "description": "",
          "alarmHint": "",
          "value": 0,
          "quality": "good",
          "alarmst": {
            "dateStatus": "2016-11-08T06:58:06Z",
            "dateStart": "2016-11-08T06:22:16Z",
            "status": "RTN",
            "type": "None"
          },

【问题讨论】:

  • 您可以发布您的 json 数据样本吗?错误告诉你 alarm 是一个字符串,而不是一个字典。
  • 您的数据不是有效的 JSON 文件。
  • @kindall 我同意...这只是与我遇到的问题的一部分相关的有效 JSON 数据的一个示例。幸运的是,这个示例似乎为解决我的问题的答案描绘了一幅图画。

标签: python python-3.x dictionary typeerror


【解决方案1】:

你的问题是:

for alarm in tag["alarmst"]:
    csv_file.writerow(alarm['dateStatus'],alarm['dateStart'], ...)

请注意,在您的数据中,alarmst 的值是一个 JSON 对象,它在 python 中被翻译成字典。因此,当您对其进行迭代时,您最终会得到键:即 alarm 将是 "dateStatus", "dateStart", "status", ...

替换为:

alarm = tag["alarmst"]
csv_file.writerow(...)

【讨论】:

  • @ITSolutions 所以给它一个列表,例如csv_file.writerow([alarm['dateStatus'], alarm['dateStart'], alarm['status'], alarm['type']])
  • @ITSolutions 我评论中的代码将 single arg 传递给csv_file.writerow:列表[alarm['dateStatus'], alarm['dateStart'], alarm['status'], alarm['type']]。您的代码传递了 两个 参数:字符串 alarm['dateStatus'] 和列表 [alarm['dateStart'], alarm['status'], alarm['type']]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
相关资源
最近更新 更多