【问题标题】:Writing directly into binary mode with csv.writer使用 csv.writer 直接写入二进制模式
【发布时间】:2019-08-16 06:51:44
【问题描述】:

我目前使用以下代码创建一个二进制文件,然后直接上传到AWS S3 现在我被告知可以使用csv.writer directly 写入二进制模式并避免使用@ 的额外步骤987654325@。但是,我仍然很难弄清楚它是如何工作的。你能帮我解决这个问题吗?

buffer = io.StringIO()
writer = csv.writer(buffer)
writer.writerow(["a", "b", "c"])
buffer_2 = io.BytesIO(buffer.getvalue().encode())

BUCKET_NAME = 'fbprophet'
OBJECT_NAME = 'blah.csv'

s3.upload_fileobj(buffer_2, BUCKET_NAME, OBJECT_NAME)

【问题讨论】:

  • python 版本 2 还是 3?
  • 我是Python 3
  • 我在帖子中提到了那个链接,但这就是我卡住的地方,我不明白如何修改我的代码来管理它。
  • 我不相信这是重复的。 @JoeyCoder 不是在写入文件,而是在内存中写入类似文件的对象,因此将标志传递给 open 不会削减它。我已经写了一个答案,简而言之:你的方法很好,我看不到显着改进它的方法。请务必传递 encoding('utf-8'),因为 Python 的默认编码是系统相关的。

标签: python python-3.x


【解决方案1】:

在我看来,你所拥有的东西是合理的。您链接到的帖子谈论写入文件,而不是内存流。文件可以以文本或二进制模式打开,这决定了它是对字符串 (str) 还是原始字节 (bytes) 进行操作。但是io 包中的内存中文件类对象没有那么灵活:StringIO 用于字符串,BytesIO 用于字节。

因为csv需要一个文本流(字符串),而boto需要一个二进制流(字节),所以需要一个转换步骤。

我建议将实际编码传递给 encode() 函数,以避免退回到 Python 的系统依赖默认值:

buffer_2 = io.BytesIO(buff.getvalue().encode('utf-8'))

【讨论】:

    猜你喜欢
    • 2020-02-22
    • 2015-04-08
    • 2017-11-29
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多