Python:检查CSV二维数组元素时出现'int'对象不可下标报错
解决CSV读取时的TypeError: 'int' object is not subscriptable问题
让我来帮你拆解并解决这个问题,你遇到的错误根源出在数组初始化、循环逻辑以及CSV读取的细节上,咱们一步步来理清楚:
错误原因分析
数组初始化的致命问题
你用arr = range(50)创建了一个包含整数的序列(Python3里是range对象,Python2里是整数列表)。当你的CSV文件行数少于50行时,arr中未被覆盖的元素依然是原始整数。比如CSV只有10行,那arr[10]到arr[49]都是整数,循环到这些位置时,arr[i][1]就相当于对整数做下标访问,这必然触发TypeError。错误覆盖内置函数
你写了len = len(arr),这会把Python内置的len()函数覆盖成一个整数,后续如果再想使用len()函数就会出问题,这是个需要避免的编程习惯。CSV读取模式与空值判断错误
在Python3中,csv.reader要求文件以文本模式打开(用"r"或"rt"),而不是你用的二进制模式"rb";另外,CSV中的空单元格会被解析为空字符串'',而非None,所以你的arr[i][1] is None条件根本检测不到空值。
修正后的代码
下面是调整后的代码,解决了所有问题,同时更健壮:
import csv # 用空列表动态存储行数据,避免固定长度带来的冗余元素问题 arr = [] # 使用with语句自动管理文件生命周期,无需手动关闭 with open("matrix1.csv", "r", newline="") as f: matrix = csv.reader(f) # 直接遍历csv.reader对象,将每一行添加到arr中 for row in matrix: arr.append(row) # 遍历所有行,检查第2列(索引为1)是否为空 for row_num, row in enumerate(arr, start=1): # 先确保该行有至少2个元素,避免索引越界报错 if len(row) >= 2: # 用strip()处理可能的空格,确保真正的空值被检测到 if row[1].strip() == '': print(f"第{row_num}行的第2列是空的(输入错误排查)") else: print(f"第{row_num}行的元素不足2个,无法检查第2列")
关键修正点说明
- 改用空列表
arr = []动态添加行,彻底避免了整数元素残留的问题 - 使用
with语句打开文件,自动处理文件关闭,代码更安全简洁 - 文本模式打开文件,符合Python3中
csv.reader的要求 - 增加行长度检查,避免因某行元素不足导致的索引越界错误
- 用
row[1].strip() == ''判断空值,能覆盖单元格是空格的情况,更准确 - 用
enumerate(arr, start=1)直接获取从1开始的行号,输出信息更直观
内容的提问来源于stack exchange,提问作者mmt
相关产品推荐
相关产品推荐

