【问题标题】:error: list indices must be indtegers, not str错误:列表索引必须是整数,而不是 str
【发布时间】:2016-10-04 16:46:19
【问题描述】:
fields = ["date", "time", "a_x", "a_y", "a_z", "roll", "pitch", "yaw", "ug_x", "ug_y", "ug_z", "o2", "hyd", "bpm"]

import csv

f = open("data.TXT")


dialect = csv.Sniffer().sniff(f.read(), delimiters=' ')


f.seek(0)

reader = csv.reader(f, dialect)

rows = []

obj = {}

for row in reader:
  for i, field in enumerate(fields):
    obj[field] = row[i]
    if field == "a_x":
        obj[field] = float(row[i])
    elif field == "a_y":
        obj[field] = float(row[i])
    elif field == "a_z":
        obj[field] = float(row[i])
    elif field == "roll":
        obj[field] = float(row[i])
    elif field == "pitch":
        obj[field] = float(row[i])
    elif field == "yaw":
        obj[field] = float(row[i])
    elif field == "ug_x":
        obj[field] = float(row[i])
    elif field == "ug_y":
        obj[field] = float(row[i])
    elif field == "ug_z":
        obj[field] = float(row[i])
    elif field == "o2":
        obj[field] = int(row[i])
    elif field == "hyd":
        obj[field] = int(row[i])
    elif field == "bpm":
        obj[field] = int(row[i])
    else:
        obj[field] = str(row[i])
  rows.append(obj)


import requests
requests.get("http://localhost:5000/api/players")


for obj in rows:
    # *** Here is the error ***
    row["player_id"] = ['03fd6907-64fc-46e7-b1f2-38af96c48037']
    requests.post("http://localhost:5000/api/impact")

错误发生在代码的倒数第二行,如注释所示。该代码旨在将信息从文本文件上传到数据库,更改数据类型以匹配写入单独文件的架构。

我不确定第 56 行的错误来源,即列表索引必须是整数,而不是 str,或者如何修复它。

【问题讨论】:

  • if 语句的那个​​怪物可以用if field in ["a_x", "a_y", ...]: obj[field] = float(row[i]) elif field in ["o2", ...]: obj[field] = int(row[i]): else: ... 代替。
  • @chepner:好点。将其添加到我的答案中。
  • @StevenRumbalski 采纳您的建议并在行中为 obj 实施:obj["player_id"] = ['03fd6907-64fc-46e7-b1f2-38af96c48037'] 我收到错误“'str' object does不支持项目分配'"
  • 在我的回答中,我确实忘记在我重写的循环中包含rows.append(obj),但我认为这不是你遇到的问题。该错误消息的意思是 rows 包含字符串,而不是字典。我在您的代码中看不到您将字符串附加到rows,所以我不确定发生在哪里。
  • @StevenRumbalski 我相信在我使用的库中导入 csv 文件的标准格式会将数据放入字符串中。此代码只是尝试根据其字段重新分配数据类型。在另一个文件中,有一个指定数据类型的架构

标签: python mongodb csv database


【解决方案1】:
for obj in rows:
    row["player_id"] = ['03fd6907-64fc-46e7-b1f2-38af96c48037']

循环变量名为obj,但您正试图访问row。 row 是前一个循环 (for row in reader:) 遗留下来的列表。将row 更改为obj,问题应该会消失:

for obj in rows:
    obj["player_id"] = ['03fd6907-64fc-46e7-b1f2-38af96c48037']

另外,在for row in reader 循环之外定义obj = {} 是一个错误。您将继续改变同一个字典,rows 中的所有 obj 将是相同的,因为它们都是对同一对象的引用。

我会将该循环重写为:

float_fields = {'a_x', 'a_y', 'a_z', 'roll', 'pitch', 'yaw', 'ug_x', 'ug_y', 'ug_z'}
int_fields = {'o2', 'hyd', 'bpm'}
for row in reader:
    obj = {} # moved inside loop
    for item, fieldname in zip(row, fields):
        if fieldname in float_fields:
            obj[fieldname] = float(item)
        elif fieldname in int_fields:
            obj[fieldname] = int(item)
        else:
            obj[fieldname] = str(item)  
    rows.append(obj)

【讨论】:

    猜你喜欢
    • 2015-05-03
    • 2017-01-27
    • 2016-02-09
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    相关资源
    最近更新 更多