如何修复循环读取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响应流:
- 先安装依赖:
pip install s3fs
- 代码实现:
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
相关产品推荐
相关产品推荐

