python中的StringIO实际上用于什么?
我不是一个专业人士,我一直在理解StringIO的用途。 我一直在环顾网上的一些例子。 但是,几乎所有的例子都非常抽象。 他们只是显示“如何”使用它。 但是他们没有一个显示“为什么”和“在哪种情况下”应该/将要使用它? 提前致谢
Ps不会与这个问题在stackoverflow混淆: StringIO用法比较string和StringIo。
当你有一些只接收文件的API时就会使用它,但是你需要使用一个string。 例如,要使用Python 2中的gzip模块压缩string:
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()
StringIO为您提供对文件类似string的访问,因此您可以使用现有的模块来处理文件,几乎没有任何变化,并且可以使用string。
例如,假设你有一个把事情写入文件的logging器,而你想通过networking发送日志输出。 您可以读取文件并将其内容写入networking,也可以将日志写入到一个StringIO对象,并将其发送到其networking目标,而无需触及文件系统。 StringIO使得它很容易做到这一点,然后切换到第二种方式。
在需要类似文件的类文件对象的情况下,而是写入内存中的string缓冲区时:StringIO是工具。 如果要构build大型string(如纯文本文档)并进行大量string连接,则可能会发现使用StringIO而不是一堆mystr += 'more stuff\n'
types的操作更容易。
几件我个人曾经用过的东西:
-
整个文件caching。 我有一个脚本,它读取PDF文件,并对其进行各种validation。 我正在使用的PDF库在其文档构造函数中有一个打开的文件。 我原本打开了我正在阅读的PDF文件,但是当我改变它来一次读取整个文件到内存中,然后把一个StringIO对象传递给PDF库,我的脚本运行时间就减半了。
-
延期打印。 相同的脚本在每个读取的PDF之前打印一个标题。 但是,我可以在命令行上指定是否忽略configuration文件中的某些testing,或仅包含某些testing。 如果我忽略了给定PDF的所有testing,我不想打印头文件,但是在完成运行testing(testing可以dynamic定义)之前,我不会知道我运行了多lesstesting。 所以我通过改变
sys.stdout
指向它来将头部捕获到一个StringIO对象中,并且每次运行一个testing时,我都检查该对象是否有任何内容。 如果是这样,我打印然后重置它清空。 瞧,只有有testing的PDF文件才会打印标题。
我刚刚在实践中使用了StringIO两件事情:
- 通过将
sys.stdout
redirect到一个StringIO
实例以便于分析,对unit testing一个执行大量print
的脚本; - 要使用
ElementTree
创build一个保证格式良好的XML文档(一个自定义的API请求),然后write
它通过HTTP连接发送。
不是你经常需要StringIO
,但有时候它非常有用。
Django有一个函数call_command
用来调用pipe理命令。 这个函数打印输出到标准输出,并不返回任何值。 如果你想知道命令是否成功运行,你必须看看输出和决定。
使用StringIO,您可以捕获输出并检查是否需要输出。
with io.StringIO() as output: call_command('custom_command', stdout=output) if 'Success' not in output.getvalue(): print('Custom command failed...')