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

