gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:55:12 25 4
gpt4 key购买 nike

我需要创建一个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())


我收到此错误: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()


将3行写入文件,但是我无法释放内存以写入大文件。如果我添加:

f.seek(0)
f.truncate(0)


到循环,则仅写入文件的最后一行。有什么方法可以释放资源而不删除文件中的行?

最佳答案

我确实找到了问题的解决方案,如果其他人有兴趣,我将在此处发布。我决定将其作为分段上传的一部分进行。您无法流式传输到S3。还有一个软件包可以将您的流式文件更改为我使用的分段上传文件:Smart Open

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()

关于python - 您可以使用流而不是本地文件上传到S3吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58444694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com