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

如何修复循环读取AWS S3桶中Parquet文件时的报错问题?

修复S3循环读取Parquet文件的文件关闭错误

在使用boto3循环读取AWS S3桶中的Parquet文件时,出现ValueError: I/O operation on closed file和ArrowInvalid: Called Open() on an uninitialized FileSource错误,原因是boto3返回的response['Body']是流式对象,pandas读取时可能因流被提前关闭导致异常。以下是两种可行的修复方案:

方案一:将响应体转为BytesIO对象

通过一次性读取流式内容到内存中的BytesIO对象,避免流被提前关闭:

import boto3
import pandas as pd
from io import BytesIO

session = boto3.Session(
    aws_access_key_id=key,
    aws_secret_access_key=secret,
    region_name=region_name
)
                    
s3 = session.resource('s3')
bucket = s3.Bucket(bucket_name)

for obj in bucket.objects.filter(Prefix=folder_path):
    # 跳过S3中的空文件夹对象
    if obj.key.endswith('/'):
        continue
    
    response = obj.get()
    # 读取完整内容并包装为类文件对象
    parquet_buffer = BytesIO(response['Body'].read())
    df = pd.read_parquet(parquet_buffer)
    
    # 执行数据处理逻辑
    # ...

方案二:使用s3fs简化读取流程

借助s3fs库让pandas直接读取S3路径,无需手动处理boto3响应流:

  1. 先安装依赖:
pip install s3fs
  1. 代码实现:
import pandas as pd
import s3fs

# 初始化S3文件系统
s3_fs = s3fs.S3FileSystem(
    key=key,
    secret=secret,
    region_name=region_name
)

# 获取所有非文件夹的Parquet文件路径
parquet_files = [
    f"s3://{bucket_name}/{file_key}" 
    for file_key in s3_fs.ls(folder_path) 
    if not file_key.endswith('/')
]

for file_path in parquet_files:
    df = pd.read_parquet(file_path, filesystem=s3_fs)
    
    # 执行数据处理逻辑
    # ...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:25:32