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)
nmi*_*els 33
StringIO为您提供类似于文件的字符串访问权限,因此您可以使用现有的模块来处理文件,几乎不做任何更改并使其与字符串一起使用.
例如,假设您有一个将事物写入文件的记录器,而您希望通过网络发送日志输出.您可以读取文件并将其内容写入网络,也可以将日志写入StringIO对象并将其发送到其网络目标,而无需触及文件系统.StringIO可以通过第一种方式轻松实现,然后切换到第二种方式.
jat*_*ism 17
如果你想要一个像文件一样的文件对象,但是要写入内存中的字符串缓冲区:StringIO就是这个工具.如果您正在构建大型字符串(例如纯文本文档)并执行大量字符串连接,您可能会发现使用StringIO而不是一堆mystr += 'more stuff\n'
类型的操作更容易.
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。
我亲自用它做了几件事:
整个文件缓存.我有一个脚本可以读取PDF并对各种事情进行验证.我正在使用的PDF库在其文档构造函数中使用一个打开的文件.我最初只是打开了我感兴趣阅读的PDF,但是当我将其更改为立即将整个文件读入内存然后将StringIO对象传递给PDF库时,我的脚本的运行时间减少了一半.
延期印刷.相同的脚本在读取的每个PDF之前打印一个标题.但是,我可以在命令行上指定是忽略其配置文件中的某些测试,还是仅包含某些测试.如果我忽略给定PDF的所有测试,我不希望打印标题,但我不知道在运行测试之前我运行了多少测试(测试也可以动态定义).因此,我通过更改sys.stdout
指向它来将标头捕获到StringIO对象中,每次运行测试时,我都会检查该对象是否包含任何内容.如果是这样,我打印然后将其重置为空.瞧,只有测试的PDF有打印标题.
我刚刚在实践中使用了StringIO来做两件事:
print
通过重定向sys.stdout
到StringIO
实例以便于分析来对完成大量操作的脚本进行单元测试;ElementTree
然后write
通过HTTP连接发送,以创建保证格式良好的XML文档(自定义API请求).不是StringIO
经常需要,但有时它非常有用.