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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 11:13:00