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

使用csv.reader处理CSV时遇TypeError:需传入str/None而非list

解决CSV城市筛选代码错误并实现需求

需求与问题现状

需求:CSV文件第10列为'DeathCity',需筛选出该列城市与用户输入匹配的记录(使用upper()忽略大小写差异)。

运行以下Python代码时触发错误:

import csv

city = input("Enter a city name:")

f = open("/file.txt")
spamreader=csv.reader(f)

for DeathCity in spamreader:
    print("\t".split(DeathCity))

报错信息:

Traceback (most recent call last):
      File "hmwk3_1", line 7, in <module>
        print("\t".split(DeathCity))
TypeError: must be str or None, not list

错误原因分析

  1. 方法使用颠倒:split()是把字符串按分隔符拆成列表,你却把CSV行数据(列表类型)传给它,参数类型不匹配触发TypeError。要把列表转成制表符分隔的字符串应该用join()。
  2. 变量命名混淆:循环变量DeathCity实际代表CSV的一整行数据,不是单独的城市列,命名误导了逻辑。
  3. 未定位目标列:没有获取第10列的城市数据(CSV索引从0开始,第10列对应索引9)。
  4. 未实现大小写无关匹配:没对用户输入和列数据做upper()统一转换。
  5. 文件管理不规范:直接open()文件后未手动关闭,容易造成资源泄漏。

修正后的代码

import csv

# 获取用户输入并转大写,统一匹配规则
target_city = input("Enter a city name:").upper()

# 用with语句自动管理文件,代码块结束后自动关闭
with open("/file.txt", "r") as f:
    spamreader = csv.reader(f)
    # 遍历每一行数据
    for row in spamreader:
        # 先判断行数据长度,避免索引越界
        if len(row) >= 10:
            # 取第10列(索引9)并转大写
            death_city = row[9].upper()
            # 匹配成功则输出整行(制表符分隔)
            if death_city == target_city:
                print("\t".join(row))

代码说明

  • 文件资源管理:with语句自动处理文件关闭,避免手动操作的遗漏。
  • 大小写兼容:用户输入和CSV列数据都转成大写,彻底消除大小写差异影响。
  • 列定位准确:用row[9]获取第10列数据,符合CSV索引从0开始的规则。
  • 边界防护:len(row)>=10的判断,避免部分行数据不足时触发索引越界错误。
  • 输出修正:用"\t".join(row)把行列表转成制表符分隔的字符串,正确输出整行内容。

内容的提问来源于stack exchange,提问作者Victoria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:57:19