为什么以下两种解码方法会返回不同的结果?
>>> import codecs
>>>
>>> data = ['', '', 'a', '']
>>> list(codecs.iterdecode(data, 'utf-8'))
[u'a']
>>> [codecs.decode(i, 'utf-8') for i in data]
[u'', u'', u'a', u'']
这是一个错误还是预期的行为?我的Python版本2.7.13。
答案 0 :(得分:4)
这很正常。 iterdecode
在编码块上采用迭代器,并在解码块上返回迭代器,但它并不承诺一对一的对应关系。它保证所有输出块的串联是对所有输入块的串联的有效解码。
如果查看source code,您会看到它明确丢弃空输出块:
def iterdecode(iterator, encoding, errors='strict', **kwargs):
"""
Decoding iterator.
Decodes the input strings from the iterator using an IncrementalDecoder.
errors and kwargs are passed through to the IncrementalDecoder
constructor.
"""
decoder = getincrementaldecoder(encoding)(errors, **kwargs)
for input in iterator:
output = decoder.decode(input)
if output:
yield output
output = decoder.decode("", True)
if output:
yield output
请注意iterdecode
存在的原因,以及您不能自己在所有块上调用decode
的原因是解码过程是有状态的。一个字符的UTF-8编码形式可能分为多个块。其他编解码器可能有非常奇怪的有状态行为,比如可能是一个字节序列,它会反转所有字符的大小写,直到再次看到该字节序列为止。