如何将CSV中的字符串型true/false映射为JSON标准布尔值?
如何在CSV转JSON时将字符串"true"/"false"映射为JSON布尔值?
我目前用这段Python代码把CSV文件转换成JSON:
import os import csv import json with open(args.infile, encoding="utf-8") as csv_file: csv_rows = list(csv.DictReader(csv_file)) with open(args.outfile, "w", encoding="utf-8") as json_file: json.dump(csv_rows, json_file, ensure_ascii=False, indent=2)
但CSV里某列的值是字符串类型的"true"和"false",转换后它们还是JSON里的字符串(带引号),我需要把它们映射成JSON的布尔值true和false(不带引号)。请问有没有内置的实现方式可以做到这一点?
嘿,这个需求很常见!遗憾的是Python标准库的csv模块并没有提供直接的内置参数来自动完成这种字符串到布尔值的映射,但我们可以在读取CSV后、写入JSON前,加一层简单的处理逻辑,完全能满足你的需求,而且代码改动很小。
方法一:自定义转换函数
我们可以写一个小函数来处理字符串到布尔值的转换,然后遍历每一行的字段进行处理:
import os import csv import json def str_to_bool(value): # 兼容大小写的转换,比如"True"/"FALSE"也能被识别 lower_val = value.lower() if lower_val == "true": return True elif lower_val == "false": return False # 不是目标字符串就原样返回,不影响其他列的数据 return value with open(args.infile, encoding="utf-8") as csv_file: csv_reader = csv.DictReader(csv_file) processed_rows = [] for row in csv_reader: # 对每一行的每个键值对应用转换函数 processed_row = {key: str_to_bool(val) for key, val in row.items()} processed_rows.append(processed_row) with open(args.outfile, "w", encoding="utf-8") as json_file: # json.dump会自动把Python的True/False转成JSON的true/false json.dump(processed_rows, json_file, ensure_ascii=False, indent=2)
方法二:用字典映射简化代码
如果觉得写函数有点繁琐,也可以直接用字典映射来快速转换,代码更简洁:
import os import csv import json # 定义字符串到布尔值的映射表 bool_mapping = {"true": True, "false": False} with open(args.infile, encoding="utf-8") as csv_file: csv_reader = csv.DictReader(csv_file) processed_rows = [ {k: bool_mapping.get(v.lower(), v) for k, v in row.items()} for row in csv_reader ] with open(args.outfile, "w", encoding="utf-8") as json_file: json.dump(processed_rows, json_file, ensure_ascii=False, indent=2)
为什么这样可行?
Python的json模块在序列化时,会自动把Python的布尔类型True转换成JSON的true,False转换成JSON的false,完全符合你要的格式。我们只需要提前把CSV里的字符串"true"/"false"转换成Python的布尔值就可以了。
如果你的CSV里的"true"/"false"都是严格小写的,也可以去掉.lower(),让转换更高效。
内容的提问来源于stack exchange,提问作者Robert Strauch
相关产品推荐
相关产品推荐

