
CSV 文件本身仅支持二维结构,无法直接存储嵌套列表;写入时会将内层列表转为字符串,读取后需用 ast.literal_eval 安全还原为 Python 对象,从而完整恢复原始的三维整数列表结构。
csv 文件本身仅支持二维结构,无法直接存储嵌套列表;写入时会将内层列表转为字符串,读取后需用 `ast.literal_eval` 安全还原为 python 对象,从而完整恢复原始的三维整数列表结构。
在 Python 中处理嵌套列表(如 list[list[int]] 或更深层结构)与 CSV 的交互时,一个常见误区是认为 csv.writer.writerows() 能原样保存嵌套结构。实际上,CSV 是纯文本格式,其单元格内容只能是字符串——当 writerows() 接收形如 [[[1,2,3], [4,5,6]], [[7,8,9], [0,1,2]]] 的数据时,它会自动将每个内层列表(如 [1,2,3])调用 str() 转换为字符串 '[1, 2, 3]',并按 CSV 规则加引号写入文件。因此,读取时 csv.reader 返回的是字符串列表,而非嵌套列表对象。
要准确还原原始结构,关键在于读取后的安全反序列化。推荐使用 ast.literal_eval() ——它专为解析 Python 字面量(如列表、元组、数字、字符串等)设计,比 eval() 安全得多,可防止代码注入风险。
以下是完整、可复用的解决方案:
从 CSV 数据集生成图数据库加载器和三元组映射。将表格 CSV 数据转换为图数据库可直接使用的节点、边和三元组。
import csv
import ast
# 原始三维整数列表:外层为行,中层为“子行”,内层为整数
data = [
[[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:每行对应 data 的一个外层元素(即一个 list[list[int]])
with open('nested_data.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows(data) # 自动将每个 [1,2,3] → '"[1, 2, 3]"'
# ✅ 读取并还原:对每一行的每个字符串列执行 literal_eval
with open('nested_data.csv', 'r', newline='') as f:
reader = csv.reader(f)
restored = [[ast.literal_eval(cell) for cell in row] for row in reader]
# 验证结果完全一致
print(restored == data) # True⚠️ 注意事项:
- 不要使用 json 替代? 虽然 JSON 更适合嵌套结构,但本方案坚持用 CSV 是因需求明确限定于 CSV I/O 场景(如兼容 Excel、数据库导入等);
- 避免 eval():eval() 可执行任意代码,存在严重安全隐患;ast.literal_eval() 仅允许安全字面量,强烈推荐;
- 空值/异常处理:若 CSV 中可能存在空单元格或格式错误,建议添加 try/except 包裹 ast.literal_eval();
- 性能考量:对于超大数据集(>10 万行),可考虑分块处理或改用 pandas + to_json()/read_json() 组合。
总结:CSV 不是通用序列化格式,面对嵌套结构时,“字符串化写入 + 字面量解析读取”是最简洁、安全且标准的实践路径。只要确保写入与解析逻辑匹配,即可无缝实现嵌套列表的持久化与重建。

















