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

Python从S3读取CSV维护数据类型及Data Wrangler读取异常问题

解决S3读取CSV时的数据类型转换与表头识别问题

方案一:原生读取并手动转换数据类型

针对直接split导致所有内容为字符串的问题,通过自定义转换函数处理每个元素:

s3_clientobj = s3_client.get_object(Bucket=S3_BUCKET, Key=mkey)

def convert_value(val):
    if val == '':
        return None  # 空字符串转为PostgreSQL兼容的null
    # 优先尝试转整数,失败则尝试浮点数,最终保留字符串
    try:
        return int(val)
    except ValueError:
        try:
            return float(val)
        except ValueError:
            return val

td = []
for line in s3_clientobj['Body'].iter_lines():
    row = line.decode('utf-8').split(',')
    converted_row = [convert_value(item) for item in row]
    td.append(converted_row)

转换后列表示例:

[['I', 13, None, 'mynull'], ['I', 14, None, 'mynull'], ['I', 15, None, 'mynull'], ['I', 16, None, 'mynull']]
  • 该方法适配列数不固定的场景,无需提前定义结构,空值转为None可直接用于PostgreSQL插入。

方案二:AWS Data Wrangler正确读取(避免首行丢失)

Data Wrangler默认将首行识别为表头,只需添加header=None参数即可保留所有数据行,同时自动处理数据类型:

import awswrangler as wr

# 读取CSV,指定无表头,同时将自定义空值标识转为NaN
df = wr.s3.read_csv(
    path=f"s3://{S3_BUCKET}/{mkey}",
    header=None,
    na_values=['', 'mynull']  # 将空字符串和自定义的mynull转为NaN
)

# 将NaN替换为PostgreSQL兼容的None
df = df.where(df.notna(), None)

# 转换为元组列表用于execute_many
tuples = [tuple(row) for row in df.to_numpy()]

转换后元组列表示例:

[('I', 13, None, 'mynull'), ('I', 14, None, 'mynull'), ('I', 15, None, 'mynull'), ('I', 16, None, 'mynull')]
  • header=None确保首行被当作数据而非表头,避免数据丢失;na_values可扩展更多自定义空值标识。

内容的提问来源于stack exchange,提问作者Vorcry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:42:59