从S3将CSV数据加载到Jupyter Notebook中

时间:2018-02-01 14:03:45

标签: python pandas csv jupyter-notebook boto3

我在Amazon Cloud的S3存储桶中有几个CSV文件(50 GB)。我正在尝试使用以下代码在Jupyter Notebook(使用Python3内核)中读取这些文件:

import boto3
from boto3 import session
import pandas as pd

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')

names = ['id','origin','name']
dataset = pd.read_csv(response['Body'], names=names)
dataset.head() 

但是当我运行代码时,我遇到以下错误:

valueError:无效的文件路径或缓冲区对象类型:class'botocore.response.StreamingBody'

我遇到了这个bug report关于pandas和boto3对象尚不兼容的问题。

我的问题是,如何将我的S3存储桶中的这些CSV文件导入到在云上运行的Jupyter笔记本中。

2 个答案:

答案 0 :(得分:3)

我发布此修复程序以解决我的问题,万一有人需要它。我用以下内容替换了read_csv行,问题解决了:

dataset = pd.read_csv(io.BytesIO(response['Body'].read()), encoding='utf8')

答案 1 :(得分:3)

您还可以使用s3fs,它允许熊猫直接从S3中读取:

import s3fs

# csv file
df = pd.read_csv('s3://{bucket_name}/{path_to_file}')

# parquet file
df = pd.read_parquet('s3://{bucket_name}/{path_to_file}')

然后,如果存储桶中有多个文件,则可以像这样遍历它们:

import boto3
s3_resource = boto3.resource('s3')
bucket = s3_resource.Bucket(name='{bucket_name}')
for file in bucket.objects.all():
    # do what you want with the files
    # for example:
    if 'filter' in file.key:
        print(file.key)
        new_df = pd.read_csv('s3:://{bucket_name}/{}'.format(file.key))