File: open_function.rst

package info (click to toggle)
python-future 0.18.2-6
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 4,264 kB
  • sloc: python: 43,246; makefile: 136; sh: 29
file content (39 lines) | stat: -rw-r--r-- 1,506 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
.. _open-function:

open()
------

The Python 3 builtin :func:`open` function for opening files returns file
contents as (unicode) strings unless the binary (``b``) flag is passed, as in::

    open(filename, 'rb')

in which case its methods like :func:`read` return Py3 :class:`bytes` objects.

On Py2 with ``future`` installed, the :mod:`builtins` module provides an
``open`` function that is mostly compatible with that on Python 3 (e.g. it
offers keyword arguments like ``encoding``). This maps to the ``open`` backport
available in the standard library :mod:`io` module on Py2.7.

One difference to be aware of between the Python 3 ``open`` and
``future.builtins.open`` on Python 2 is that the return types of methods such
as :func:`read()` from the file object that ``open`` returns are not
automatically cast from native bytes or unicode strings on Python 2 to the
corresponding ``future.builtins.bytes`` or ``future.builtins.str`` types. If you
need the returned data to behave the exactly same way on Py2 as on Py3, you can
cast it explicitly as follows::

    from __future__ import unicode_literals
    from builtins import open, bytes

    data = open('image.png', 'rb').read()
    # On Py2, data is a standard 8-bit str with loose Unicode coercion.
    # data + u'' would likely raise a UnicodeDecodeError

    data = bytes(data)
    # Now it behaves like a Py3 bytes object...

    assert data[:4] == b'\x89PNG'
    assert data[4] == 13     # integer
    # Raises TypeError:
    # data + u''