【问题标题】:Load CSV data into Jupyter Notebook from S3从 S3 将 CSV 数据加载到 Jupyter Notebook
【发布时间】:2018-07-11 21:17:38
【问题描述】:

我在 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:文件路径或缓冲区对象类型无效:类'botocore.response.StreamingBody'

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

我的问题是,我还能如何将这些 CSV 文件从我的 S3 存储桶导入到在云端运行的 Jupyter Notebook 中。

【问题讨论】:

    标签: python pandas csv jupyter-notebook boto3


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您也可以使用 s3fs,它允许 pandas 直接从 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))
      

      【讨论】:

        最近更新 更多