Python StringIO.write 不喜欢整数零?

Python StringIO.write doesn't like integer zero?

为什么 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

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

if not s: return

s 是您传递给 write 的内容)。

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

fileobj.write() 的接口要求您编写一个 字符串 ,总是:

file.write(str)
Write a string to the file.

强调我的。

这是一个实现细节,对于 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