You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何读写嵌套整数列表到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:44:51