您可以使用流而不是本地文件上传到S3吗?

inq*_*nds 29 python csv amazon-s3 buffering boto

我需要创建一个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 row in testDict:
    writer.writerow(row)
    k.set_contents_from_string(f.getvalue())

f.close()
Run Code Online (Sandbox Code Playgroud)

向文件写入3行,但是我无法释放内存来写大文件.如果我添加:

f.seek(0)
f.truncate(0)
Run Code Online (Sandbox Code Playgroud)

到循环,然后只写入文件的最后一行.有没有办法释放资源而不删除文件中的行?

inq*_*nds 27

我确实找到了我的问题的解决方案,我将在此处发布以防其他人感兴趣.我决定在分段上传中将其作为部分.您无法流式传输到S3.还有一个可用的包可以将您的流文件更改为我使用的分段上传:智能打开.

import smart_open
import io
import csv

testDict = [{
    "fieldA": "8",
    "fieldB": None,
    "fieldC": "888888888888"},
    {
    "fieldA": "9",
    "fieldB": None,
    "fieldC": "99999999999"}]

fieldnames = ['fieldA', 'fieldB', 'fieldC']
f = io.StringIO()
with smart_open.smart_open('s3://dev-test/bar/foo.csv', 'wb') as fout:
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
    fout.write(f.getvalue())

    for row in testDict:
        f.seek(0)
        f.truncate(0)
        writer.writerow(row)
        fout.write(f.getvalue())

f.close()
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

23490 次

最近记录:

7 年,4 月 前