【问题标题】:Python: Trying to understand import ioPython:试图理解 import io
【发布时间】:2019-08-14 10:25:51
【问题描述】:

我目前正在尝试了解导入io

1) 我仍然没有弄清楚变量buffer_2 中发生了什么。为什么需要这一步?

2) 我不知道delimiter 的默认csv.writer 是什么。需要设置这个参数吗?

buff = io.StringIO()
writer = csv.writer(buff, dialect='excel', delimiter=',')
writer.writerow(["a", "b", "c"])
buffer_2 = io.BytesIO(buff.getvalue().encode())

# Updated code sample here
BUCKET_NAME = 'fbprophet'
OBJECT_NAME = 'blah.csv'

s3.upload_fileobj(buffer_2, BUCKET_NAME, OBJECT_NAME)

【问题讨论】:

  • 对不起,你是对的。我之前将其更改为缓冲区。它现在在我的示例中“已修复”。
  • import io 需要让您使用io 模块中的方法/类型。你读过BytesIO的文档吗?
  • csv 模块的默认分隔符是逗号。你不需要指定它,但如果你是明确的,显然不会有任何问题

标签: python


【解决方案1】:

我不知道这段代码来自哪里,所以我只能猜测。我想说作者需要一个二进制缓冲区——bytes 的缓冲区,它的作用类似于二进制文件。这是io.BytesIO 实例。但是csv.writer() 使用文本并需要一个文本文件。 io.StringIO 实例就像一个文本文件。所以内容首先被写入文本文件类对象(buff),然后编码为bytes,并包装在二进制文件类对象(buffer_2)中。

【讨论】:

  • 该代码的最终目标是将其直接上传到 AWS S3 存储桶上。据我所知,它可能必须是我上传的二进制文件(?)。您解释的其余部分对我来说很清楚,谢谢!
  • 我更新了代码 sn-p 以显示“文件”获取直接上传到 S3 的下两行。我的理解是否正确,我需要该二进制文件并且不能“只”从io.StringIO上传文本文件@
  • 根据the doc:“类文件对象必须是二进制模式。”
  • 根据this question,您应该可以直接使用csv.writer 写入二进制文件,这样可以节省不必要的步骤和一些内存。
猜你喜欢
  • 2018-11-12
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多