我需要创建一个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)
如果将文件打开到循环中,那么只有文件的最后一行被写入。有没有办法在不删除文件行的情况下释放资源?