Python读取CSV时不必要添加引号的问题求助
解决CSV读取时自动保留布尔/数字类型的问题
嘿,我完全懂你的困扰——用csv.DictReader读取CSV时,不管原始数据有没有引号,所有值都会被默认转成字符串,原本的布尔值True变成了字符串'True',数字12变成'12',这确实挺烦人的。下面给你几个实用的解决思路:
方法1:手动字段类型转换(适合字段固定的场景)
既然DictReader只能返回字符串,那我们就自己写个转换函数,读取后对每个字段做类型修正:
import csv def fix_data_types(row): # 把isTrue字段转成布尔值 row['isTrue'] = row['isTrue'].lower() == 'true' # 把ID字段转成整数 row['ID'] = int(row['ID']) # name字段本来就是字符串,不用动 return row # 读取CSV并处理 with open('your_csv_file.csv', 'r') as file: reader = csv.DictReader(file) processed_data = [fix_data_types(row) for row in reader] print(processed_data) # 输出结果: [{'name': 'ashok', 'isTrue': True, 'ID': 12}]
这个方法简单直接,适合你的CSV字段结构固定的情况,想转啥类型就明确指定。
方法2:用类型映射表(适合字段较多的场景)
如果你的CSV字段比较多,写一堆判断太麻烦,可以搞个字段-转换函数的映射表,批量处理:
import csv # 定义每个字段对应的转换规则 type_converters = { 'name': str, 'isTrue': lambda val: val.lower() == 'true', 'ID': int } with open('your_csv_file.csv', 'r') as file: reader = csv.DictReader(file) processed_data = [] for row in reader: # 按映射表批量转换每个字段 fixed_row = {key: type_converters[key](value) for key, value in row.items()} processed_data.append(fixed_row) print(processed_data)
这样后续要加新字段或者修改转换规则,直接更新type_converters就行,维护起来更方便。
方法3:用Pandas自动识别类型(超省心的懒人方案)
如果你的项目允许用第三方库,那pandas绝对是最佳选择——它会自动识别CSV里的布尔值、数字、字符串类型,根本不用手动写转换:
import pandas as pd # 读取CSV,pandas会自动推断字段类型 df = pd.read_csv('your_csv_file.csv') # 转成字典列表格式和你要的输出一致 processed_data = df.to_dict('records') print(processed_data) # 输出结果: [{'name': 'ashok', 'isTrue': True, 'ID': 12}]
这个方法几乎零代码,适合处理复杂或者大型CSV文件,类型识别准确率也很高。
另外补充一下:你之前用普通文件读取得到全字符串列表,本质和DictReader的问题一样——文件读取出来的所有内容都是文本,必须手动做类型转换,上面的前两个方法其实也适用于普通文件读取的场景,只是DictReader帮你把表头和行数据做了映射,省了拆分表头的步骤而已。
内容的提问来源于stack exchange,提问作者ashokkumar angadi
相关产品推荐
相关产品推荐

