VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python3标准库:codecs字符串编码和解码(8)

def encode(self, input, final=False):
  • data, nbytes = codecs.charmap_encode(input,
  • self.errors,
  • encoding_map)
  • return data
  •  
  • class InvertCapsIncrementalDecoder(codecs.IncrementalDecoder):
  • def decode(self, input, final=False):
  • data, nbytes = codecs.charmap_decode(input,
  • self.errors,
  • decoding_map)
  • return data
  •  
  • class InvertCapsStreamReader(InvertCapsCodec,
  • codecs.StreamReader):
  • pass
  •  
  • class InvertCapsStreamWriter(InvertCapsCodec,
  • codecs.StreamWriter):
  • pass
  •  
  • def find_invertcaps(encoding):
  • """Return the codec for 'invertcaps'.
  • """
  • if encoding == 'invertcaps':
  • return codecs.CodecInfo(
  • name='invertcaps',
  • encode=InvertCapsCodec().encode,
  • decode=InvertCapsCodec().decode,
  • incrementalencoder=InvertCapsIncrementalEncoder,
  • incrementaldecoder=InvertCapsIncrementalDecoder,
  • streamreader=InvertCapsStreamReader,
  • streamwriter=InvertCapsStreamWriter,
  • )
  • return None
  •  
  •  
  • codecs.register(find_invertcaps)
  •  
  • if __name__ == '__main__':
  •  
  • # Stateless encoder/decoder
  • encoder = codecs.getencoder('invertcaps')
  • text = 'abcDEF'
  • encoded_text, consumed = encoder(text)
  • print('Encoded "{}" to "{}", consuming {} characters'.format(
  • text, encoded_text, consumed))
  •  
  • # Stream writer
  • import io
  • buffer = io.BytesIO()
  • writer = codecs.getwriter('invertcaps')(buffer)
  • print('StreamWriter for io buffer: ')
  • print(' writing "abcDEF"')
  • writer.write('abcDEF')
  • print(' buffer contents: ', buffer.getvalue())
  •  
  • # Incremental decoder
  • decoder_factory = codecs.getincrementaldecoder('invertcaps')
  • decoder = decoder_factory()
  • decoded_text_parts = []
  • for c in encoded_text:
  • decoded_text_parts.append(
  • decoder.decode(bytes([c]), final=False)
  • )
  • decoded_text_parts.append(decoder.decode(b'', final=True))
  • decoded_text = ''.join(decoded_text_parts)
  • print('IncrementalDecoder converted {!r} to {!r}'.format(
  • encoded_text, decoded_text))
  • 无状态编码器/解码器的基类是Codec,要用新实现来覆盖encode()和decode()(在这里分别调用了charmap_encode()和charmap_decode())。这些方法必须分别返回一个元组,其中包含转换的数据和已消费的输入字节或字符数。charmap_encode()和charmap_decode()已经返回了这个消息,所以很方便。

    IncrementalEncoder和incrementalDecoder可以作为增量式编码接口的基类。增量来的encode()和decode()方法被定义为只返回真正的转换数据。缓冲的有关消息都作为内部状态来维护。invertcaps编码不需要缓冲数据(它使用一种一对一映射)。如果编码根据所处理的数据会生成不同数量的输出,如压缩算法,那么对于这些编码,BufferedIncrementalEncoder和BufferedIncrementalDecoder将是更合适的基类,因为它们可以管理输入中未处理的部分。

    StreamReader和StreamWriter也需要encode()和decode()方法,而且因为它们往往返回与Codec中相应方法同样的值,所以实现时可以使用多重继承。

    
    相关教程
    关于我们--广告服务--免责声明--本站帮助-友情链接--版权声明--联系我们       黑ICP备07002182号