Lambda中用boto3读S3的CSV并通过psycopg2的copy_from跳过表头写入Postgres
根因说明
S3 get_object 返回的obj['Body']是S3StreamingBody二进制流类型,未实现普通文本文件的行迭代逻辑,直接调用next()无法按行跳过表头。
最优实现方案
推荐使用io.TextIOWrapper封装二进制流,完全复用本地文件的处理逻辑,不需要全量加载文件到内存,支持大文件导入:
import boto3 import io s3 = boto3.client('s3') # 从S3加载文件 obj = s3.get_object(Bucket=bucket, Key=key) # 将二进制流转为可按行迭代的UTF-8文本流,可根据实际文件编码调整encoding参数 contents = io.TextIOWrapper(obj['Body'], encoding='utf-8') # 正常跳过表头行 next(contents, None) cur = DBCONN.cursor() cur.copy_from(contents, 'my_table', sep='\t') DBCONN.commit()
小文件可选实现
如果CSV文件体积很小,也可以全量读取后截断表头:
import boto3 import io s3 = boto3.client('s3') obj = s3.get_object(Bucket=bucket, Key=key) # 全量读取后转文本、按行拆分,跳过第一行表头 all_lines = obj['Body'].read().decode('utf-8').splitlines() content_stream = io.StringIO('\n'.join(all_lines[1:])) cur = DBCONN.cursor() cur.copy_from(content_stream, 'my_table', sep='\t') DBCONN.commit()
内容的提问来源于stack exchange,提问作者Element Zero
相关产品推荐
相关产品推荐

