亚马逊S3中50GB CSV文件导入Jupyter Notebook报错的解决方法
解决Pandas读取S3 StreamingBody的ValueError问题
你遇到的这个错误确实是因为Pandas的read_csv目前没法直接处理boto3返回的StreamingBody对象,不过有好几种实用的方法可以绕开这个问题,下面给你详细说明:
方案1:将StreamingBody转换为文件对象
可以用io.StringIO(针对文本格式CSV)或者io.BytesIO(二进制格式场景)把StreamingBody包装成Pandas能识别的文件对象,代码示例如下:
import boto3 import pandas as pd import io session = boto3.session.Session(region_name='XXXX') s3client = session.client('s3', config = boto3.session.Config(signature_version='XXXX')) response = s3client.get_object(Bucket='myBucket', Key='myKey') # 用StringIO包装StreamingBody,注意根据实际编码调整decode参数 csv_file = io.StringIO(response['Body'].read().decode('utf-8')) names = ['id','origin','name'] dataset = pd.read_csv(csv_file, names=names) dataset.head()
提示:如果你的CSV使用了非UTF-8编码(比如GBK),记得把decode里的参数改成对应编码。
方案2:用s3fs让Pandas直接读取S3路径
s3fs库可以让Pandas直接通过s3://格式的路径读取文件,不需要手动处理boto3客户端,代码更简洁,还支持大文件分块读取(适合你50GB的场景):
首先先安装依赖:
pip install s3fs
然后简化后的读取代码:
import pandas as pd names = ['id','origin','name'] dataset = pd.read_csv('s3://myBucket/myKey', names=names, storage_options={ 'region_name': 'XXXX', 'signature_version': 'XXXX' }) dataset.head()
方案3:先下载文件到本地再读取
如果你的本地磁盘有足够存储空间,也可以先把S3文件下载到本地,再读取:
import boto3 import pandas as pd session = boto3.session.Session(region_name='XXXX') s3client = session.client('s3', config = boto3.session.Config(signature_version='XXXX')) # 下载S3文件到本地 s3client.download_file('myBucket', 'myKey', 'local_csv_file.csv') # 读取本地文件 names = ['id','origin','name'] dataset = pd.read_csv('local_csv_file.csv', names=names) dataset.head()
注意:这个方法对于50GB的大文件来说,会占用大量本地磁盘空间,且下载耗时较长,适合小文件或本地空间充足的场景。
内容的提问来源于stack exchange,提问作者sepideh
相关产品推荐
相关产品推荐

