Python TypeError,用于迭代数据值的逻辑

2024-09-27 23:22:46 发布

您现在位置:Python中文网/ 问答频道 /正文

json.load()函数的for循环读取“alarmst”字段并返回它们的值时遇到问题。你知道吗

我在问题代码上面有一个工作代码,它可以很好地处理相同的数据,得到“tag”字段的数据值。你知道吗

我认为这可能与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"
          },

Tags: csv数据indevimportjsonfortag
1条回答
网友
1楼 · 发布于 2024-09-27 23:22:46

你的问题是:

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

相关问题 更多 >

    热门问题