我正在将文件从S3复制到Cloudfiles,我想避免将文件写入磁盘.Python-Cloudfiles库有一个看起来像我需要的object.stream()调用,但我找不到boto中的等效调用.我希望我能够做到这样的事情:
shutil.copyfileobj(s3Object.stream(),rsObject.stream())
Run Code Online (Sandbox Code Playgroud)
这可能与boto(或我认为任何其他s3库)?
我正在尝试将私有S3存储桶中的CSV文件读取到pandas数据帧:
df = pandas.read_csv('s3://mybucket/file.csv')
Run Code Online (Sandbox Code Playgroud)
我可以从公共存储桶读取文件,但从私有存储桶读取文件会导致HTTP 403:Forbidden错误.
我已使用aws configure配置了AWS凭据.
我可以使用boto3从私有桶下载文件,它使用aws凭据.我似乎需要配置pandas以使用AWS凭据,但不知道如何.
我正在尝试使用以下代码将位于AWS S3存储桶中的CSV文件作为pandas数据帧读入内存:
import pandas as pd
import boto
data = pd.read_csv('s3:/example_bucket.s3-website-ap-southeast-2.amazonaws.com/data_1.csv')
Run Code Online (Sandbox Code Playgroud)
为了提供完全访问权限,我在S3存储桶上设置了存储桶策略,如下所示:
{
"Version": "2012-10-17",
"Id": "statement1",
"Statement": [
{
"Sid": "statement1",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::example_bucket"
}
]
Run Code Online (Sandbox Code Playgroud)
}
不幸的是我仍然在python中得到以下错误:
boto.exception.S3ResponseError: S3ResponseError: 405 Method Not Allowed
Run Code Online (Sandbox Code Playgroud)
想知道是否有人可以帮助解释如何在AWS S3中正确设置权限或正确配置pandas以导入文件.谢谢!
我试图csv从S3桶中读取一个对象,并已能够使用以下代码成功读取数据.
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()
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用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()
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我在python 2.7上,不能使用Python 3.
使用 boto3,您可以从 S3 中的某个位置读取文件内容,根据存储桶名称和密钥(这假设是初步的import boto3)
s3 = boto3.resource('s3')
content = s3.Object(BUCKET_NAME, S3_KEY).get()['Body'].read()
Run Code Online (Sandbox Code Playgroud)
这将返回一个字符串类型。我需要获取的特定文件恰好是一组类似字典的对象,每行一个。所以它不是 JSON 格式。我不想将其作为字符串读取,而是将其作为文件对象流式传输并逐行读取;除了首先在本地下载文件之外,找不到其他方法来执行此操作
s3 = boto3.resource('s3')
bucket = s3.Bucket(BUCKET_NAME)
filename = 'my-file'
bucket.download_file(S3_KEY, filename)
f = open('my-file')
Run Code Online (Sandbox Code Playgroud)
我要问的是是否可以对文件进行这种类型的控制,而不必先在本地下载它?