如何将含多维列表等多类型数据的CSV读取为Python字典/字典列表?
解决CSV导入为带正确类型的字典列表问题
问题背景
你需要导入的CSV格式如下:
name,value,isTrue,multiDimArray
Paul, 10, True,[[0,0],[10.5,100],[135.5,87.5]]
Amy, 3, True,[[0,0]]
Jack, 9, False,[[100,100],[100.5,22.5],[15.5,87]]
目标是将其转为包含字符串、整数、布尔值、numpy数组/列表类型的字典列表,但csv.DictReader会把所有内容解析为字符串,np.genfromtxt无法处理嵌套数组结构导致报错或类型异常。
解决方案
方法1:使用csv.DictReader配合手动类型转换
利用ast.literal_eval解析嵌套数组字符串,同时对其他字段做类型转换:
import csv import ast import numpy as np def convert_row(row): converted = {} # 处理字符串类型的name字段 converted['name'] = row['name'].strip() # 转换value为整数 converted['value'] = int(row['value'].strip()) # 转换isTrue为布尔值 converted['isTrue'] = row['isTrue'].strip().lower() == 'true' # 解析多维数组为列表,可选转为numpy数组 arr_list = ast.literal_eval(row['multiDimArray'].strip()) converted['multiDimArray'] = np.array(arr_list) # 若不需要numpy,直接用arr_list即可 return converted inputFile = 'your_file.csv' with open(inputFile, 'r') as file: csv_reader = csv.DictReader(file) data = [convert_row(row) for row in csv_reader] # 验证类型(可选) for item in data: print(f"name: {type(item['name'])} | value: {type(item['value'])} | isTrue: {type(item['isTrue'])} | multiDimArray: {type(item['multiDimArray'])}")
方法2:使用Pandas快速处理
Pandas的read_csv支持自定义转换器,能更简洁地完成类型转换:
import pandas as pd import ast import numpy as np # 定义各字段的转换规则 converters = { 'value': int, 'isTrue': lambda x: x.strip().lower() == 'true', 'multiDimArray': lambda x: np.array(ast.literal_eval(x.strip())) } # 读取CSV并应用转换器 df = pd.read_csv('your_file.csv', converters=converters) # 转为字典列表 data = df.to_dict('records') # 验证类型(可选) for item in data: print(f"name: {type(item['name'])} | value: {type(item['value'])} | isTrue: {type(item['isTrue'])} | multiDimArray: {type(item['multiDimArray'])}")
说明
- CSV本身是纯文本格式,没有内置类型信息,因此必须手动指定转换规则;
ast.literal_eval比eval更安全,能合法解析Python语法格式的字符串(比如你的多维数组);- 当前CSV格式无需调整,只要保证
multiDimArray字段符合Python列表语法即可。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

