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

如何用boto3 iter_lines读取S3含换行的大CSV并提取单列(不占全内存)

处理S3中含字段内换行的大型CSV流式读取问题

不用先调用iter_lines()拆分行,直接用Python内置的csv模块配合S3的StreamingBody就能解决问题——csv.reader本身能识别引号包裹的字段内的换行,自动把被拆碎的片段拼成完整行,而且全程流式处理,不会把整个文件塞进内存。

代码示例

import boto3
import csv

# 初始化S3客户端
s3_client = boto3.client('s3')
# 获取S3对象的流式Body
obj = s3_client.get_object(Bucket="my-bucket", Key="sample.csv")
stream = obj['Body'].iter_lines(decode_unicode=True)

# 用csv.reader解析流,自动处理字段内换行
csv_reader = csv.reader(stream)

# 提取目标列(比如第二列,索引为1)
for row in csv_reader:
    if row:  # 跳过可能的空行
        print(row[1])

关键说明

  • 别用iter_lines()先拆分再喂给csv.reader,那样会把字段内的换行当成行分隔符,导致行错乱。直接把iter_lines()返回的迭代器传给csv.reader,它会按照CSV规范正确识别完整行。
  • 流式处理的逻辑是读一点解析一点,内存占用始终很低,完全适配大型CSV文件。

适配特殊CSV格式

如果你的CSV用了自定义分隔符、引号字符,直接给csv.reader加参数就行:

# 比如用分号分隔、单引号包裹字段的CSV
csv_reader = csv.reader(stream, delimiter=';', quotechar="'")

如果CSV编码不是UTF-8,用codecs模块包装流:

import codecs

# 适配GBK编码的CSV
stream = codecs.getreader('gbk')(obj['Body'])
csv_reader = csv.reader(stream)

内容的提问来源于stack exchange,提问作者Dominus.Vobiscum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:16:11