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

标签 python csv amazon-s3 boto buffering

我需要创建一个 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 does not support chunked transfer

更新:我找到了一种直接写入 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/31031463/

相关文章:

python - 反转数据框中给定日期的时间

Windows 10045 上的 Python 套接字错误

ruby-on-rails - 在Ruby on Rails中复制文件

Python pandas 从 csv 文件中读取列表数据类型的列表

amazon-web-services - 通过 HTTP 从 Cloudfront 访问 Amazon S3

c# - 在处理响应后使用 Amazon S3 响应流

python - 无符号数和有符号数的numpy总和变为 float

Python 数据整理

mysql - 从 CSV 导入到 Mysql 对数字进行四舍五入

amazon-web-services - 从具有特定前缀的 S3 存储桶复制文件夹