在Python中,我该如何检查StringIO对象的大小?

56

如何获取StringIO对象中的字节?

3个回答

82

StringIO对象实现了文件API,因此您可以像处理file对象一样获取其大小:将游标移到末尾并查看偏移量。

from StringIO import StringIO
import os
s = StringIO()
s.write("abc")
pos = s.tell()
s.seek(0, os.SEEK_END)
print s.tell()
s.seek(pos)

正如 Kimvais 提到的那样,您还可以使用 len,但请注意,这仅适用于 StringIO 对象。总的来说,首先使用这些对象的一个主要原因是将它们与期望文件类似对象的代码一起使用。当您处理通用的类似文件的对象时,通常希望执行上述操作以获取其长度,因为这适用于 任何 类似文件的对象。


3
我建议在检查文件位置对于你的任何消费者都很重要的情况下,存储pos = s.tell()s.seek(pos)的结果。 - ThorSummoner

21

通过检查len属性,使用getvalue()方法

Type "help", "copyright", "credits" or "license" for more information.
>>> import StringIO
>>> s = StringIO.StringIO()
>>> s.write("foobar")
>>> s.len
6
>>> s.write(" and spameggs")
>>> s.len
19
>>> s.getvalue()
'foobar and spameggs'

我本来打算调用tell(),但你的方法显然更正确。 - Omnifarious
1
我没有那个。相反,我有这个:['class', 'delattr', 'doc', 'format', 'getattribute', 'hash', 'init', 'iter', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'close', 'closed', 'flush', 'getvalue', 'isatty', 'next', 'read', 'readline', 'readlines', 'reset', 'seek', 'tell', 'truncate'] - TIMEX
5
我猜你实际上在使用cStringIO而不是StringIO,但我不知道为什么它没有与StringIO相匹配的len属性。我猜测len属性实际上是未记录的,这也有点奇怪。 - Glenn Maynard
27
请注意,len 函数在 Python3 中已经被移除,因此您不能在 Python3 中使用您的解决方案。 - shezi
7
在使用Python3时,请注意StringIO.write()会返回写入的字符数量,因此您只需跟踪这些数量而无需检查长度。 - Kimvais
显示剩余2条评论

0
我使用了'getvalue'方法,并检查了返回值的长度
len(s.getvalue())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接