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

使用Boto3读取S3中的Gzip压缩CSV文件并查看内容

解决Boto3读取S3中Gzip压缩CSV文件的问题

我来帮你搞定这个读取S3压缩CSV并统计行数的问题~你遇到的“无此文件或目录”报错,大概率是因为误将S3对象的键(Key)当成了本地文件路径来处理,毕竟本地文件操作函数(比如open())没法直接识别S3的远程路径。下面给你一步步的解决方案:

核心思路

直接从S3获取对象的字节流,在内存中完成解压和CSV处理,不需要下载到本地,既高效又能避免路径错误。

完整代码示例

import boto3
import gzip
import io
import csv

# 初始化S3客户端
s3 = boto3.client('s3')

# 替换成你的Bucket名称和文件Key
bucket_name = "your-bucket-name"
file_key = "path/to/your/target-file.csv.gz"

try:
    # 从S3获取对象
    response = s3.get_object(Bucket=bucket_name, Key=file_key)
    
    # 读取压缩文件的字节内容
    compressed_data = response['Body'].read()
    
    # 解压字节流
    with gzip.GzipFile(fileobj=io.BytesIO(compressed_data), mode='rb') as gz_file:
        # 解码为字符串(根据你的CSV编码调整,比如utf-8、gbk等)
        csv_str = gz_file.read().decode('utf-8')
    
    # 统计CSV行数(用csv.reader处理更准确,避免字段内换行的情况)
    row_count = 0
    with io.StringIO(csv_str) as csv_file:
        csv_reader = csv.reader(csv_file)
        # 如果需要跳过表头,可以加一行 next(csv_reader)
        for _ in csv_reader:
            row_count += 1
    
    print(f"CSV文件总行数:{row_count}")

except Exception as e:
    print(f"处理出错:{str(e)}")

关键细节说明

  • 避免本地路径误区:不要用gzip.open(file_key)或者open(file_key)这类本地文件操作,S3的Key不是本地路径,必须通过Boto3的get_object获取字节流。
  • 内存中处理:用io.BytesIO把字节数据包装成类文件对象,传给gzip.GzipFile解压,全程不需要落地到本地磁盘。
  • 准确统计行数:用csv.reader遍历比直接按\n分割更可靠,因为CSV的字段里可能包含换行符,直接分割会导致行数统计错误。
  • 编码注意:解码时要和CSV文件的实际编码一致,常见的是utf-8,如果是中文文件可能需要gbk等编码。

关于之前的JSON误解

既然已经确认原生格式是CSV,那用上面的csv模块处理就完全没问题啦,不用再考虑JSON的解析逻辑~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:35:46