实际上用于python的StringIO是什么?

Hos*_*ein 66 python string io caching

我不是专业人士,而且我一直在理解StringIO的用途.我一直在互联网上寻找一些例子.但是,几乎所有的例子都非常抽象.他们只是展示了如何使用它.但它们都没有显示"为什么"和"在哪种情况下"应该/将使用它?提前致谢

ps不要与stackoverflow上的这个问题混淆:StringIO用于比较string和StringIo的用法.

Pet*_*rin 79

当你有一些只接受文件的API但你需要使用一个字符串时使用它.例如,要使用Python 2中的gzip模块压缩字符串:

import gzip
import StringIO

stringio = StringIO.StringIO()
gzip_file = gzip.GzipFile(fileobj=stringio, mode='w')
gzip_file.write('Hello World')
gzip_file.close()

stringio.getvalue()
Run Code Online (Sandbox Code Playgroud)

  • 换句话说:`鸭子打字`:D (2认同)
  • 从 Python 3.2 开始,gzip 模块具有直接压缩数据的功能。(但任何目前需要 StringIO 的知名开源库可能会在一段时间后增加此类功能,因此与其搜索新示例,不如将 gzip 留在这里。) (2认同)

nmi*_*els 33

StringIO为您提供类似于文件的字符串访问权限,因此您可以使用现有的模块来处理文件,几乎不做任何更改并使其与字符串一起使用.

例如,假设您有一个将事物写入文件的记录器,而您希望通过网络发送日志输出.您可以读取文件并将其内容写入网络,也可以将日志写入StringIO对象并将其发送到其网络目标,而无需触及文件系统.StringIO可以通过第一种方式轻松实现,然后切换到第二种方式.

  • stringIO 对于直接将文件写入 S3 也很有帮助(即无需先在本地保存然后上传)。 (2认同)

jat*_*ism 17

如果你想要一个像文件一样的文件对象,但是要写入内存中的字符串缓冲区:StringIO就是这个工具.如果您正在构建大型字符串(例如纯文本文档)并执行大量字符串连接,您可能会发现使用StringIO而不是一堆mystr += 'more stuff\n'类型的操作更容易.

  • 我还发现`StringIO`在处理多个兆字节的字符数据时比在一个循环中的`mystr + ="more stuff \n"`这样的表达式要快得多,特别是如果你可以使用`cStringIO .StringIO`而不仅仅是`io.StringIO`. (3认同)

Bri*_*rns 11

我用它代替文本文件进行单元测试。

例如,要制作一个 csv '文件' 以使用 Pandas (Python 3) 进行测试:

import io
f = io.StringIO("id,name\n1,brian\n2,amanda\n3,zoey\n")
df = pd.read_csv(f) # pandas takes a file path or a file-like object
Run Code Online (Sandbox Code Playgroud)

这里的文档:

用于文本 I/O 的内存中流。调用 close() 方法时将丢弃文本缓冲区。

缓冲区的初始值可以通过提供initial_value 来设置。

方法 getvalue():返回一个包含缓冲区全部内容的 str。


kin*_*all 9

我亲自用它做了几件事:

  1. 整个文件缓存.我有一个脚本可以读取PDF并对各种事情进行验证.我正在使用的PDF库在其文档构造函数中使用一个打开的文件.我最初只是打开了我感兴趣阅读的PDF,但是当我将其更改为立即将整个文件读入内存然后将StringIO对象传递给PDF库时,我的脚本的运行时间减少了一半.

  2. 延期印刷.相同的脚本在读取的每个PDF之前打印一个标题.但是,我可以在命令行上指定是忽略其配置文件中的某些测试,还是仅包含某些测试.如果我忽略给定PDF的所有测试,我不希望打印标题,但我不知道在运行测试之前我运行了多少测试(测试也可以动态定义).因此,我通过更改sys.stdout指向它来将标头捕获到StringIO对象中,每次运行测试时,我都会检查该对象是否包含任何内容.如果是这样,我打印然后将其重置为空.瞧,只有测试的PDF有打印标题.


900*_*000 9

我刚刚在实践中使用了StringIO来做两件事:

  • print通过重定向sys.stdoutStringIO实例以便于分析来对完成大量操作的脚本进行单元测试;
  • 使用ElementTree然后write通过HTTP连接发送,以创建保证格式良好的XML文档(自定义API请求).

不是StringIO 经常需要,但有时它非常有用.