错误:列表索引必须是indtegers,而不是str
问题描述:
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")
错误发生在第二行到最后一行代码中,如注释所示。该代码旨在将信息从文本文件上载到数据库,并将数据类型更改为与写入单独文件的模式匹配。错误:列表索引必须是indtegers,而不是str
我不确定第56行错误的来源,列表索引必须是整数,而不是str,或者如何解决它。
答
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']
而且,它是定义obj = {}
外for row in reader
循环的错误。您将继续突变相同的字典,并且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)
的'if'声明的那怪物可以通过'如果场取代为 “A_X”, “a_y”,...]:OBJ [字段] = float(row [i])[“o2”,...]中的elif字段:obj [field] = int(row [i]):else:...'。 – chepner
@chepner:好点。添加到我的答案。 –
@StevenRumbalski考虑您的建议和行执行 的OBJ: OBJ [ “player_id”] = [ '03fd6907-64fc-46e7-b1f2-38af96c48037'] 我收到错误消息“ '海峡' 对象不支持项目分配'“ – user6922159