从CSV生成字典列表时的混合数据类型自动转换问题
从CSV生成字典列表时的混合数据类型自动转换问题
嘿,这个需求太常见了!从CSV读出来的内容默认全是字符串,手动挨个转类型确实头疼,咱们可以写个小巧的类型转换辅助函数,让程序自动识别并转换对应的数据类型,一起来看看怎么实现:
第一步:写一个类型转换辅助函数
这个函数会对每个字符串值做判断,依次尝试转换成布尔值、整数、浮点数,处理不了的就保留原字符串,空值还可以转成None(你也可以根据需求调整):
def convert_value(value): # 先清理值里的多余双引号 cleaned_value = value.replace('"', '').strip() # 处理空字符串 if not cleaned_value: return None # 处理布尔值 if cleaned_value == 'True': return True elif cleaned_value == 'False': return False # 处理整数 try: return int(cleaned_value) except ValueError: pass # 处理浮点数 try: return float(cleaned_value) except ValueError: pass # 都匹配不上就返回清理后的原字符串 return cleaned_value
第二步:优化CSV读取代码
你原来的代码手动处理了表头和行,其实可以用csv.DictReader来简化,同时把类型转换逻辑整合进去,顺便清理表头里的多余引号:
import csv lenses_dict = [] with open("lens_specifications.csv", 'r') as lenses_input: # 初始化DictReader,先读取表头 reader = csv.DictReader(lenses_input) # 清理表头的多余双引号 cleaned_headers = [header.replace('"', '').strip() for header in reader.fieldnames] # 遍历每一行数据 for row in reader: # 对每个键值对做清理和类型转换 cleaned_row = { cleaned_headers[i]: convert_value(list(row.values())[i]) for i in range(len(cleaned_headers)) } lenses_dict.append(cleaned_row) # 打印转换后的结果 for item in lenses_dict: print(item)
转换后的效果示例
运行上面的代码后,你会看到数据类型已经自动转换了,比如:
{ 'Name': 'SEL2470GMII', 'Manufacturer': 'Sony', 'Zoom': True, # 变成布尔值 'Focal Length': 24, # 变成整数 'Max Aperture': 2.8, # 变成浮点数 'Min Aperture': 22, 'Min Focus Distance': 210, 'Focal Length Max': 70, 'Min Focus Distance^': 300, 'Fixed Aperture': True, 'Max Aperture^': None, # 空字符串转成了None 'Min Aperture^': None }
一些额外的小提示
- 如果你的CSV里有其他表示空值的字符串(比如
"NA"、"N/A"),可以在转换函数里加上判断,把它们也转成None - 如果布尔值的写法不统一(比如小写的
"true"/"false"),可以把cleaned_value转成小写后再判断:if cleaned_value.lower() == 'true' - 要是有特殊格式的数值(比如带逗号的千分位),可以先把逗号去掉再尝试转换
内容来源于stack exchange
相关产品推荐
相关产品推荐

