Python StringIO.write不像整数零?

时间:2015-02-14 08:13:55

标签: python stream stringio

为什么stream.write输出几乎不是零?

from StringIO import StringIO
v0 = 0
v1 = 1
a = [1, 0, v1, v0, "string", 0.0, 2.0]
stream = StringIO()
for v in a:
    stream.write(v)
    stream.write('\n')
print stream.getvalue()

使用Python 2.7.6,运行此代码会产生:

1

1

string

2.0

2 个答案:

答案 0 :(得分:3)

它看起来像是在StringIO.py,第214行(函数write):

if not s: return

s正在传递给write)。

换句话说,'falsy'值(例如None,[],0等)将被丢弃。

答案 1 :(得分:3)

fileobj.write()的界面要求您编写字符串,始终:

  

file.write(str)
  将字符串写入文件。

强调我的。

这是一个实现细节,StringIO()非字符串只是发生才能工作。代码optimises the 'empty string' case使用:

if not s: return

避免进行不必要的字符串连接。这意味着如果您传入任何 falsey 值,例如数字0或None或空容器,则不会写入。

在写入之前将对象转换为字符串:

for v in a:
    stream.write(str(v))
    stream.write('\n')

如果您在此处使用了C优化版本,则表示您遇到错误:

>>> from cStringIO import StringIO
>>> f = StringIO()
>>> f.write(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be string or buffer, not int