base64io

Python has had native base64 encoding support since 2.4, which is great. However, when we needed to encoded and decode streaming data, we realized that there is no streaming interface for base64 encoding, and there doesn’t appear to be anything available from the community either.

There is the legacy base64.encode and base64.decode interface, but while this interface lets you shuffle data between two streams, it assumes that you are starting with two complete streams. What we really wanted was a standard stream that applies base64 encoding/decoding.

This led us to build base64io.Base64IO.

The latest full documentation can be found at Read the Docs.

Find us on GitHub.

Getting Started

Required Prerequisites

None

Installation

$ pip install base64io

Use

base64io.Base64IO works by wrapping another stream and transparently transforming data written to or read from that stream.

  • write() encodes data before writing it to the wrapped stream
  • read() decodes data after reading it from the wrapped stream

Because the position of the base64io.Base64IO stream and the wrapped stream will almost always be differently, base64io.Base64IO does not support:

  • seek()
  • tell()

base64io.Base64IO also does not support:

  • fileno()
  • truncate()

Encode data

Warning

Any time you are writing to a base64io.Base64IO stream, you must close the stream after your final write. Because of how the base64 transformation works, up to two bytes of unencoded data might be held in an internal buffer and not written to the wrapped stream. Calling close() flushes this buffer and writes the padded result to the wrapped stream.

If you are using base64io.Base64IO as a context manager, we take care of this for you.

from base64io import Base64IO

with open('source_file', 'rb') as source, open('encoded_file', 'wb') as target:
   with Base64IO(target) as encoded_target:
      for line in source:
         encoded_target.write(line)

Decode data

Note

Because of how the base64 transformation works, any calls to read() might read up to three additional bytes from the underlying stream.

from base64io import Base64IO

with open('encoded_file', 'rb') as encoded_source, open('target_file', 'wb') as target:
   with Base64IO(encoded_source) as source:
      for line in source:
         target.write(line)

License

This library is licensed under the Apache 2.0 License.

Modules

base64io Base64 stream context manager.