如何使用boto3在AWS中将CSV转换为JSON?附代码求助
在AWS中用boto3将CSV转换为JSON的正确方法
我来帮你一步步解决这个问题~先看看你现有代码里的问题,再给你一个能正常运行的版本。
你的代码存在的问题
- Bucket参数类型错误:
s3_client.get_object()的Bucket参数需要传入字符串格式的桶名,但你传的是s3.Bucket('bucket_name')这个对象,会直接触发参数错误。 - CSV解析逻辑错误:你直接遍历文本的每个字符(
[ row for row in text ]),这会把每个字符当成独立元素,完全没有解析CSV的行和列结构。 - JSON序列化错误:你把字符列表嵌套后转JSON,输出的内容并不是CSV对应的结构化数据,不符合转换需求。
正确的实现代码
下面分两种常见场景给出代码,你可以根据自己的CSV结构选择:
场景1:CSV包含表头(转成字典格式的JSON数组)
这是最常用的场景,CSV第一行是字段名,后续每行转成以字段名为键的字典:
import boto3 import csv import json from io import StringIO s3_client = boto3.client('s3') def lambda_handler(event, context): # 替换成你的桶名和CSV文件键 bucket_name = 'bucket_name' csv_key = 'Untitled1.csv' # 1. 从S3获取CSV文件 response = s3_client.get_object(Bucket=bucket_name, Key=csv_key) csv_content = response["Body"].read().decode("utf-8") # 2. 用StringIO将文本转为类文件对象,方便csv模块读取 csv_file = StringIO(csv_content) # 3. 用DictReader解析CSV,自动用表头作为字典的键 csv_reader = csv.DictReader(csv_file) # 转换为JSON格式,indent=2用于格式化输出 json_output = json.dumps(list(csv_reader), indent=2) print("转换后的JSON内容:") print(json_output) # 可选:将转换后的JSON存回S3 # s3_client.put_object( # Bucket=bucket_name, # Key='converted_output.json', # Body=json_output, # ContentType='application/json' # ) return json_output
场景2:CSV无表头(转成列表格式的JSON数组)
如果你的CSV没有表头,每行直接转成列表元素:
import boto3 import csv import json from io import StringIO s3_client = boto3.client('s3') def lambda_handler(event, context): bucket_name = 'bucket_name' csv_key = 'Untitled1.csv' response = s3_client.get_object(Bucket=bucket_name, Key=csv_key) csv_content = response["Body"].read().decode("utf-8") csv_file = StringIO(csv_content) csv_reader = csv.reader(csv_file) json_output = json.dumps(list(csv_reader), indent=2) print("转换后的JSON内容:") print(json_output) return json_output
关键知识点说明
- 使用
StringIO的原因:csv模块的阅读器需要类文件对象作为输入,直接用字符串无法处理,StringIO可以把字符串包装成类文件对象,避免创建临时文件。 csv.DictReader的作用:自动识别CSV第一行作为表头,把后续每行数据映射为字典,让JSON结构更清晰易读。- 权限注意:确保Lambda执行角色拥有S3的
GetObject和(如果需要存回的话)PutObject权限。
内容的提问来源于stack exchange,提问作者raviraju
相关产品推荐
相关产品推荐

