You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:54:52