使用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
错误原因分析
- 方法使用颠倒:
split()是把字符串按分隔符拆成列表,你却把CSV行数据(列表类型)传给它,参数类型不匹配触发TypeError。要把列表转成制表符分隔的字符串应该用join()。 - 变量命名混淆:循环变量
DeathCity实际代表CSV的一整行数据,不是单独的城市列,命名误导了逻辑。 - 未定位目标列:没有获取第10列的城市数据(CSV索引从0开始,第10列对应索引9)。
- 未实现大小写无关匹配:没对用户输入和列数据做
upper()统一转换。 - 文件管理不规范:直接
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
相关产品推荐
相关产品推荐

