为何代码无法从CSV文件读取数独数值并重构数独棋盘
问题描述
print_board函数用于格式化打印数独棋盘,直接使用代码内硬编码的数独二维数组时功能正常,但读取sudoku.csv文件作为数据源时运行异常。sudoku.csv文件内容如下,值之间用分号分隔:
7;8;0;4;0;0;1;2;0 6;0;0;0;7;5;0;0;9 0;0;0;6;0;1;0;7;8 0;0;7;0;4;0;2;6;0 0;0;1;0;5;0;9;3;0 9;0;4;0;6;0;0;0;5 0;7;0;3;0;0;0;1;2 1;2;0;0;0;7;4;0;0 0;4;9;2;0;6;0;0;7
原问题代码:
import csv with open('sudoko.csv') as f: #next(f) board = csv.reader(f,delimiter=';') for row in board: print(row) def print_board(bo): for i in range(len(bo)): if i % 3 == 0 and i != 0: print("- - - - - - - - - - - - - ") for j in range(len(bo[0])): if j % 3 == 0 and j != 0: print(" | ", end="") if j == 8: print(bo[i][j]) else: print(str(bo[i][j]) + " ", end="") print(print_board(row))
问题定位
代码一共存在4处明显错误:
- 文件名拼写错误:打开文件时写的是
sudoko.csv,和实际文件名sudoku.csv的字母顺序错了,直接运行会报文件不存在的错误。 - 棋盘数据没有正确组装:
csv.reader返回的是迭代器,原代码只在循环里逐行打印了内容,没有把所有行收集成完整的二维列表,循环结束后row变量只保留了csv最后一行的一维数据,传给需要9*9二维列表的print_board后,遍历逻辑完全不符合预期。 - 多余的打印包裹:
print_board本身是直接打印内容的函数,没有返回值,外层套print()会在棋盘内容输出完之后多打印一行None。 - 数据类型问题:csv读取到的所有值都是字符串类型,虽然打印不受影响,但后续如果要做数独求解逻辑会触发类型错误,读取时最好转成整数。
修正后代码
import csv board = [] # 修正文件名,指定编码适配不同系统 with open('sudoku.csv', encoding='utf-8') as f: reader = csv.reader(f, delimiter=';') for row in reader: # 每行内容转整数,过滤空值跳过空行 processed_row = [int(num.strip()) for num in row if num.strip()] if len(processed_row) == 9: board.append(processed_row) def print_board(bo): for i in range(len(bo)): if i % 3 == 0 and i != 0: print("- - - - - - - - - - - - - ") for j in range(len(bo[0])): if j % 3 == 0 and j != 0: print(" | ", end="") if j == 8: print(bo[i][j]) else: print(str(bo[i][j]) + " ", end="") # 直接传入完整的二维棋盘数据 print_board(board)
运行后会输出格式正确的数独棋盘:
7 8 0 | 4 0 0 | 1 2 0 6 0 0 | 0 7 5 | 0 0 9 0 0 0 | 6 0 1 | 0 7 8 - - - - - - - - - - - - - 0 0 7 | 0 4 0 | 2 6 0 0 0 1 | 0 5 0 | 9 3 0 9 0 4 | 0 6 0 | 0 0 5 - - - - - - - - - - - - - 0 7 0 | 3 0 0 | 0 1 2 1 2 0 | 0 0 7 | 4 0 0 0 4 9 | 2 0 6 | 0 0 7
内容的提问来源于stack exchange,提问作者chaos
相关产品推荐
相关产品推荐

