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
相关产品推荐
相关产品推荐

