如何移除S3存储桶中CSV文件内的双引号与三引号
S3存储桶CSV文件多余引号清理方案
你的需求核心是移除目标列的所有双引号即可实现预期效果:单引号包裹的内容去掉引号后保留原文本,连续多个双引号去掉后统一变为空值,完全匹配你给出的清理后样例。
以下是两种常用实现方案:
方案1:Python本地批量拉取处理再回传S3
- 先安装依赖包:
pip install boto3 pandas - 执行代码如下:
import boto3 import pandas as pd from io import StringIO # 按需修改下方配置参数 s3_bucket = "你的S3存储桶名称" s3_source_prefix = "待处理CSV所在文件夹路径/" target_column = "column_name" # 需要清理的列名 s3_output_prefix = "清理后文件存储路径/" # 也可以直接填原路径覆盖源文件,建议先备份再操作 s3_client = boto3.client("s3") # 遍历目标文件夹下所有CSV文件 file_list = s3_client.list_objects_v2(Bucket=s3_bucket, Prefix=s3_source_prefix) for file in file_list.get("Contents", []): file_key = file["Key"] if not file_key.endswith(".csv"): continue # 读取S3文件内容 file_content = s3_client.get_object(Bucket=s3_bucket, Key=file_key)["Body"].read().decode("utf-8") df = pd.read_csv(StringIO(file_content)) # 核心清理逻辑:移除目标列所有双引号 df[target_column] = df[target_column].str.replace('"', '', regex=False) # 处理后文件回传S3 output_buff = StringIO() df.to_csv(output_buff, index=False) output_key = s3_output_prefix + file_key.split("/")[-1] s3_client.put_object(Bucket=s3_bucket, Key=output_key, Body=output_buff.getvalue()) print(f"处理完成:{file_key}")
方案2:无服务器直接用AWS Athena处理
适合文件体积大、不想下载到本地的场景:
- 先给原始CSV文件夹创建外部表:
CREATE EXTERNAL TABLE IF NOT EXISTS raw_csv_table ( column_name string -- 如果有其他列可以在这里补充定义 ) ROW_FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( "separatorChar" = ",", "quoteChar" = "'" -- 禁用双引号作为默认识别符,避免自动转义 ) LOCATION 's3://你的存储桶名称/待处理CSV文件夹路径/' TBLPROPERTIES ("skip.header.line.count"="1");
- 直接查询生成清理后的文件到指定S3路径:
CREATE TABLE cleaned_csv_table WITH ( format = 'CSV', external_location = 's3://你的存储桶名称/清理后文件存储路径/', field_delimiter = ',', skip_header_line_count = 1 ) AS SELECT REGEXP_REPLACE(column_name, '"', '') AS column_name -- 其他列直接写列名即可不用处理 FROM raw_csv_table;
注意事项
- 处理前建议先备份原始文件,避免误操作导致数据丢失
- 如果CSV包含多个不需要处理的列,仅修改目标列的清理逻辑即可
内容的提问来源于stack exchange,提问作者Ravikant Pandey
相关产品推荐
相关产品推荐

