Python读取CSV为多维列表时重复最后一行的问题排查
问题:读取CSV到多维列表时所有行都是最后一行的内容
我尝试把一个52行7列的CSV文件读取成Python多维列表,但运行代码后输出的52行全是CSV的最后一行。确定是readFile函数有问题,但找不到错误点。
原代码
rows = 52 cols = 7 def readFile(): matrix = [] file = open("rainfall.csv","r") for line in file: data = line.split(",") for row in range(rows): matrix.append([]) for col in range(cols): matrix[row].append(data[col]) return matrix def display(matrix): for counter in matrix: for values in counter: print(values, end=" ") print() matrix = readFile() display(matrix)
当前输出(简化版)
8 25 1 6 21 23 0 8 25 1 6 21 23 0 ... 8 25 1 6 21 23 0
错误根源
你的readFile函数逻辑完全错误:
- 第一个
for循环遍历文件每一行时,每次都会把data变量覆盖成当前行的拆分结果,循环结束后data里只存了最后一行的内容。 - 后面的嵌套循环只是重复把这最后一行的元素添加到
matrix的每一行里,自然所有行都一样。
修复方案1:遍历文件时直接构建矩阵
这是最直接的写法,读取每一行就处理并添加到矩阵中,还能避免硬编码行数:
def readFile(): matrix = [] # 用with语句自动管理文件关闭,避免资源泄漏 with open("rainfall.csv", "r") as file: for line in file: # 去掉行尾的换行符,再拆分列 data = line.strip().split(",") # 将字符串转为整数(如果需要数值类型的话) row_data = [int(item) for item in data] matrix.append(row_data) return matrix def display(matrix): for row in matrix: for values in row: print(values, end=" ") print() matrix = readFile() display(matrix)
修复方案2:先收集所有行再做校验(可选)
如果你需要验证行数和列数是否符合预期,可以先把所有行读进来再处理:
expected_rows = 52 expected_cols = 7 def readFile(): matrix = [] with open("rainfall.csv", "r") as file: # 一次性读取并处理所有行 all_lines = [line.strip().split(",") for line in file] # 校验行数是否符合预期 if len(all_lines) != expected_rows: print(f"警告:文件实际行数为{len(all_lines)},预期{expected_rows}") for line_data in all_lines: # 校验列数是否符合预期 if len(line_data) != expected_cols: print(f"警告:某行实际列数为{len(line_data)},预期{expected_cols}") # 转为整数类型 row = [int(item) for item in line_data] matrix.append(row) return matrix def display(matrix): # 简化打印逻辑 for row in matrix: print(" ".join(map(str, row))) matrix = readFile() display(matrix)
内容的提问来源于stack exchange,提问作者Mateo
相关产品推荐
相关产品推荐

