如何读写嵌套整数列表到CSV并保持原格式?
解决嵌套整数列表写入CSV后读回格式异常的问题
问题现象
你尝试将三层嵌套整数列表写入CSV文件,再读回成原格式,但读回后打印整个列表时,最内层列表被单引号包裹(实际是字符串类型),单独打印元素时看起来像列表但本质是字符串:
示例代码
import csv a = [ [ [1,2,3], [4,5,6], [7,8,9] ], [ [1,2,3], [4,5,6], [7,8,9] ], [ [1,2,3], [4,5,6], [7,8,9] ], [ [1,2,3], [4,5,6], [7,8,9] ], [ [1,2,3], [4,5,6], [7,8,9] ] ] path = "enter path here" print(a) with open(path, 'w', newline='') as f: writer = csv.writer(f) writer.writerows(a) with open(path, 'r') as csv_file: csv_reader = csv.reader(csv_file) rows = list(csv_reader) print(rows)
输出对比
- 写入前打印
a:
[[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 5, 6], [7, 8, 9]]]
- 读回后打印
rows:
[['[1, 2, 3]', '[4, 5, 6]', '[7, 8, 9]'], ['[1, 2, 3]', '[4, 5, 6]', '[7, 8, 9]'], ['[1, 2, 3]', '[4, 5, 6]', '[7, 8, 9]'], ['[1, 2, 3]', '[4, 5, 6]', '[7, 8, 9]'], ['[1, 2, 3]', '[4, 5, 6]', '[7, 8, 9]']]
问题原因
CSV是平面型表格格式,原生不支持嵌套结构。当使用csv.writer.writerows()写入时,第二层的列表会被自动转为字符串(因为CSV的每个单元格只能存储单个值),所以读回时这些内容就成了字符串类型——打印整个列表时,Python用单引号标识字符串;单独打印字符串元素时,会直接输出其内容,看起来像列表但本质是字符串。
解决方案
方法一:读取时解析字符串为列表(推荐)
使用ast.literal_eval()安全地将字符串形式的列表转换为真实的列表对象,它比原生eval()更安全,不会执行恶意代码:
import csv import ast a = [ [ [1,2,3], [4,5,6], [7,8,9] ], [ [1,2,3], [4,5,6], [7,8,9] ], [ [1,2,3], [4,5,6], [7,8,9] ], [ [1,2,3], [4,5,6], [7,8,9] ], [ [1,2,3], [4,5,6], [7,8,9] ] ] path = "test.csv" # 写入CSV(无需修改写入逻辑) with open(path, 'w', newline='') as f: writer = csv.writer(f) writer.writerows(a) # 读取时解析每个单元格的字符串为列表 with open(path, 'r') as csv_file: csv_reader = csv.reader(csv_file) rows = [[ast.literal_eval(cell) for cell in row] for row in csv_reader] print(rows) print(type(rows[0][0])) # 输出 <class 'list'>,确认是列表类型
方法二:写入时扁平化,读取时重构嵌套结构
如果希望CSV文件存储纯数字(可读性更高),可以先将三层列表扁平化,写入后再按原结构规则重构:
import csv a = [ [ [1,2,3], [4,5,6], [7,8,9] ], [ [1,2,3], [4,5,6], [7,8,9] ], [ [1,2,3], [4,5,6], [7,8,9] ], [ [1,2,3], [4,5,6], [7,8,9] ], [ [1,2,3], [4,5,6], [7,8,9] ] ] path = "test_flat.csv" # 扁平化写入:将每个内层列表的元素展开为单元格 with open(path, 'w', newline='') as f: writer = csv.writer(f) for outer_row in a: flat_row = [] for inner_list in outer_row: flat_row.extend(inner_list) writer.writerow(flat_row) # 读取后重构嵌套结构:将每行9个元素拆分为3个长度为3的列表 with open(path, 'r') as csv_file: csv_reader = csv.reader(csv_file) rows = [] for flat_row in csv_reader: inner_rows = [] # 按每3个元素一组拆分 for i in range(0, len(flat_row), 3): inner_list = [int(num) for num in flat_row[i:i+3]] inner_rows.append(inner_list) rows.append(inner_rows) print(rows)
方法选择
- 方法一适合嵌套结构复杂、不想修改CSV存储形式的场景,代码简洁易维护。
- 方法二适合需要CSV文件直观可读(存储纯数字)的场景,但需提前明确嵌套结构的固定规则。
内容的提问来源于stack exchange,提问作者David777
相关产品推荐
相关产品推荐

