【问题标题】:Read a csv file from aws s3 using boto and pandas使用 boto 和 pandas 从 aws s3 读取 csv 文件
【发布时间】:2017-09-07 09:08:05
【问题描述】:

我已经阅读了herehere 的可用答案,但这些都没有帮助。

我正在尝试从S3 存储桶中读取csv 对象,并且能够使用以下代码成功读取数据。

srcFileName="gossips.csv"
def on_session_started():
  print("Starting new session.")
  conn = S3Connection()
  my_bucket = conn.get_bucket("randomdatagossip", validate=False)
  print("Bucket Identified")
  print(my_bucket)
  key = Key(my_bucket,srcFileName)
  key.open()
  print(key.read())
  conn.close()

on_session_started()

但是,如果我尝试使用 pandas 作为数据框读取相同的对象,则会出现错误。最常见的是S3ResponseError: 403 Forbidden

def on_session_started2():
  print("Starting Second new session.")
  conn = S3Connection()
  my_bucket = conn.get_bucket("randomdatagossip", validate=False)
  #     url = "https://s3.amazonaws.com/randomdatagossip/gossips.csv"
  #     urllib2.urlopen(url)

  for line in smart_open.smart_open('s3://my_bucket/gossips.csv'):
     print line
  #     data = pd.read_csv(url)
  #     print(data)

on_session_started2()

我做错了什么?我在 python 2.7 上,不能使用 Python 3。

【问题讨论】:

  • 不要在不知道自己在做什么的情况下使用那些过时的示例。去看看boto3
  • 既然你已经在使用smart_open,那么就用data = pd.read_csv(smart_open.smart_open('s3://randomdatagossip/gossips.csv'))吧。

标签: python python-2.7 pandas amazon-s3 boto


【解决方案1】:

这是我为在 S3 上从 csv 成功读取 df 所做的工作。

import pandas as pd
import boto3

bucket = "yourbucket"
file_name = "your_file.csv"

s3 = boto3.client('s3') 
# 's3' is a key word. create connection to S3 using default config and all buckets within S3

obj = s3.get_object(Bucket= bucket, Key= file_name) 
# get object and file (key) from bucket

initial_df = pd.read_csv(obj['Body']) # 'Body' is a key word

【讨论】:

【解决方案2】:

这对我有用。

import pandas as pd
import boto3
import io

s3_file_key = 'data/test.csv'
bucket = 'data-bucket'

s3 = boto3.client('s3')
obj = s3.get_object(Bucket=bucket, Key=s3_file_key)

initial_df = pd.read_csv(io.BytesIO(obj['Body'].read()))

【讨论】:

  • 适用于 parquet 以及只要它是 s3 键中的单个 parquet 文件:df = pd.read_parquet(io.BytesIO(obj['Body'].read()))
【解决方案3】:

也许你可以尝试使用 pandas read_sql 和 pyathena:

from pyathena import connect
import pandas as pd

conn = connect(s3_staging_dir='s3://bucket/folder',region_name='region')
df = pd.read_sql('select * from database.table', conn)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多