我需要创建一个CSV并将其上传到S3存储桶.因为我正在动态创建文件,所以如果我可以直接将它写入S3存储桶,而不是在本地编写整个文件,然后在最后上传文件,那会更好.
有没有办法做到这一点?我的项目是用Python编写的,我对这门语言还不熟悉.这是我到目前为止尝试的内容:
import csv
import csv
import io
import boto
from boto.s3.key import Key
conn = boto.connect_s3()
bucket = conn.get_bucket('dev-vs')
k = Key(bucket)
k.key = 'foo/foobar'
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(io.StringIO(), fieldnames=fieldnames)
k.set_contents_from_stream(writer.writeheader())
Run Code Online (Sandbox Code Playgroud)
我收到此错误:BotoClientError:s3不支持分块传输
更新:我找到了一种直接写入S3的方法,但是我找不到清除缓冲区的方法而没有实际删除我已编写的行.所以,例如:
conn = boto.connect_s3()
bucket = conn.get_bucket('dev-vs')
k = Key(bucket)
k.key = 'foo/foobar'
testDict = [{
"fieldA": "8",
"fieldB": None,
"fieldC": "888888888888"},
{
"fieldA": "9",
"fieldB": None,
"fieldC": "99999999999"}]
f = io.StringIO()
fieldnames = ['fieldA', 'fieldB', 'fieldC']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
k.set_contents_from_string(f.getvalue())
for …
Run Code Online (Sandbox Code Playgroud) 在 Haskell 中,我通过管道处理一些数据。在该处理过程中,我想有条件地将数据存储在 S3 中。是否有任何 S3 库可以让我执行此操作?实际上,我想要做的是“tee”由管道创建的管道,并将其包含的数据放在 S3 上,同时继续处理它。
我找到了 aws 库(https://hackage.haskell.org/package/aws),但是像这样的函数multipartUpload
将 a 作为Source
参数。鉴于我已经在导管内,这似乎不是我可以使用的东西。
我想压缩使用 GZIP 流动态创建的数据并将其上传到 S3,同时我希望每个压缩文件的数据为 ±1Giga。
由于文件很大,而且我要并行处理多个文件,我无法将整个数据保存在内存中,我希望尽快将数据流式传输到 S3。
此外,我无法知道压缩数据的确切大小。阅读这个问题“我可以在没有内容长度标头的情况下将文件上传到 S3 吗? ”但我不知道如何将它与 GZIPing 结合起来。
我想我可以做到这一点,如果我能够创建GZIPOutputStream
,将数据逐部分发送给它,同时读取压缩数据的块(希望是 5Mb)并使用Amazon S3将它们上传到S3:分段上传
我正在尝试做的是可能的吗?或者我唯一的选择是将数据压缩到本地存储(我的硬盘)然后上传压缩文件?
我正在从 S3 下载文件,转换其中的数据,然后创建一个新文件上传到 S3。我下载的文件不到 2GB,但因为我正在增强数据,所以当我上传它时,它非常大(200GB+)。
目前你可以想象的代码是这样的:
files = list_files_in_s3()
new_file = open('new_file','w')
for file in files:
file_data = fetch_object_from_s3(file)
str_out = ''
for data in file_data:
str_out += transform_data(data)
new_file.write(str_out)
s3.upload_file('new_file', 'bucket', 'key')
Run Code Online (Sandbox Code Playgroud)
这样做的问题是“new_file”有时太大而无法放在磁盘上。因此,我想使用 boto3upload_fileobj
以流形式上传数据,这样我根本不需要磁盘上的临时文件。
有人可以帮忙提供一个例子吗?Python 方法似乎与我熟悉的 Java 完全不同。