IT-Swarm.Net

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

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

附:不要与stackoverflow上的这个问题混淆: StringIO用法 它比较字符串和StringIo。.

63
Hossein

当你有一些只接受文件的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()
77
Petr Viktorin

快速,可靠且价格合理的云托管

注册并在30天内获得$50奖金!

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

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

30
nmichaels

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

16
jathanism

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

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

并不是说你需要StringIO 经常 ,但有时它非常有用。.

9
9000

我亲自用它做了几件事:

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

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

8
kindall

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

例如,要使用pandas进行csv'文件'测试(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

从文档 这里

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

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

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

0
Brian Burns

Django有一个函数call_command,用于调用管理命令。此函数将输出打印到stdout,不返回任何值。如果您想知道命令是否成功运行,您必须查看输出并确定。.

使用StringIO,您可以捕获输出并检查是否需要输出。.

with io.StringIO() as output:
    call_command('custom_command', stdout=output)
    if 'Success' not in output.getvalue():
        print('Custom command failed...')
0
ChillarAnand