Python读取CSV创建类实例报错TypeError: 字符串索引必须为整数
报错原因
直接遍历open()返回的普通文件对象时,循环拿到的row是逐行的原始字符串,不是按CSV表头映射的结构化字典。Python中普通字符串仅支持整数下标取值(比如row[0]取第一个字符),用row['name']这类字符串作为索引取值时,就会抛出TypeError: string indices must be integers错误。
另外你虽然导入了csv模块但完全没调用它的读取逻辑,且实例化完成的Country对象没有追加到CountryArray列表中,就算不报错最终列表也是空的。
修正方案
使用csv模块提供的DictReader读取文件,它会自动将第一行识别为表头,后续每一行返回以表头为键、单元格内容为值的字典,完全匹配你按字段名取值的需求。推荐用with上下文管理器打开文件,会自动在逻辑块结束后释放文件资源,不需要手动调用close()。另外读取到的difficulty字段是字符串类型,建议直接转成整数方便后续游戏逻辑判断。
修正后可运行代码:
import csv class Country: def __init__(self, name, capital, continent, difficulty): self.name = name self.capital = capital self.continent = continent self.difficulty = int(difficulty) country_array = [] with open('Countries.csv', 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: specific_country = Country( row['name'], row['capital'], row['continent'], row['difficulty'] ) country_array.append(specific_country) # 测试读取结果 for item in country_array: print(f"国家名:{item.name} | 首都:{item.capital} | 所属大洲:{item.continent} | 难度等级:{item.difficulty}")
注意事项
- 你给出的CSV示例里中国的首都拼写为
Bejing,正确拼写为Beijing,建议修改源文件避免后续答题逻辑出错。 - 打开文件时指定
encoding='utf-8'可以规避跨系统打开文件的乱码问题,即便文件内容全为英文也建议加上。 - Python变量命名推荐使用小写蛇形格式(比如
country_array),大驼峰一般用于类名,属于编码规范问题,不影响代码运行。
内容的提问来源于stack exchange,提问作者Arthur Reade
相关产品推荐
相关产品推荐

