Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 将S3文件作为对象检索,而不是下载到绝对系统路径_Python 2.7_Amazon Web Services_Amazon S3_Aws Sdk - Fatal编程技术网

Python 2.7 将S3文件作为对象检索,而不是下载到绝对系统路径

Python 2.7 将S3文件作为对象检索,而不是下载到绝对系统路径,python-2.7,amazon-web-services,amazon-s3,aws-sdk,Python 2.7,Amazon Web Services,Amazon S3,Aws Sdk,我刚开始学习和使用S3,阅读文档。实际上,我没有找到任何东西来将文件提取到对象中,而不是从S3下载它?如果这是可能的,或者我遗漏了什么 实际上,我希望在下载文件后避免额外的IO。您可以使用StringIO并使用get\u contents\u as\u string从S3获取文件内容,如下所示: import pandas as pd import StringIO from boto.s3.connection import S3Connection AWS_KEY = 'XXXXXXDDD

我刚开始学习和使用S3,阅读文档。实际上,我没有找到任何东西来将文件提取到对象中,而不是从S3下载它?如果这是可能的,或者我遗漏了什么


实际上,我希望在下载文件后避免额外的IO。

您可以使用
StringIO
并使用
get\u contents\u as\u string
从S3获取文件内容,如下所示:

import pandas as pd
import StringIO
from boto.s3.connection import S3Connection

AWS_KEY = 'XXXXXXDDDDDD'
AWS_SECRET = 'pweqory83743rywiuedq'
aws_connection = S3Connection(AWS_KEY, AWS_SECRET)
bucket = aws_connection.get_bucket('YOUR_BUCKET')

fileName = "test.csv"

content = bucket.get_key(fileName).get_contents_as_string()
reader = pd.read_csv(StringIO.StringIO(content))
s3_client = boto3.client('s3')
s3_response_object = s3_client.get_object(Bucket=BUCKET_NAME_STRING, Key=FILE_NAME_STRING)
object_content = s3_response_object['Body'].read()

您可能正在查找boto3 S3客户端的
get\u object()
方法:

这将获得一个带有成员
Body
的响应对象字典,该字典是一个
StreamingBody
对象,您可以将其用作普通文件并在其上调用
.read()
方法。要将S3对象的全部内容放入内存,可以执行以下操作:

import pandas as pd
import StringIO
from boto.s3.connection import S3Connection

AWS_KEY = 'XXXXXXDDDDDD'
AWS_SECRET = 'pweqory83743rywiuedq'
aws_connection = S3Connection(AWS_KEY, AWS_SECRET)
bucket = aws_connection.get_bucket('YOUR_BUCKET')

fileName = "test.csv"

content = bucket.get_key(fileName).get_contents_as_string()
reader = pd.read_csv(StringIO.StringIO(content))
s3_client = boto3.client('s3')
s3_response_object = s3_client.get_object(Bucket=BUCKET_NAME_STRING, Key=FILE_NAME_STRING)
object_content = s3_response_object['Body'].read()

我更喜欢这种方法,相当于:

但另一种方法可以将对象读入
StringIO

import StringIO
import boto3
s3 = boto3.resource('s3')
def read_s3_contents_with_download(bucket_name, key):
    string_io = StringIO.StringIO()
    s3.Object(bucket_name, key).download_fileobj(string_io)
    return string_io.getvalue()

GetObject(请参阅)有帮助吗?这里的
返回是什么?这是一个函数吗?你能发布整个工作示例吗?嗨@Joe,我在这里松散地使用了
return
关键字来表示程序员想要的东西。我将这些语句包装在函数定义中以使其更清晰。谢谢。如何将拼花地板文件从S3读入变量
string\u io
?我尝试了上面的代码并得到了错误:
TypeError:string参数应为,得到了“bytes”
。嗨@Joe,Python 3有
BytesIO
,您可以尝试使用而不是
StringIO
。如果没有帮助,你可能需要问一个新问题。@Joe我这里有一个解决这个问题的方法,使用@Carl G建议的
BytesIO