with - python open encoding utf-8



Backporting Python 3 open(encoding="utf-8") en Python 2 (4)

J'ai une base de code Python, construite pour Python 3, qui utilise le style Python 3 open () avec le paramètre de codage:

https://github.com/miohtama/vvv/blob/master/vvv/textlineplugin.py#L47

    with open(fname, "rt", encoding="utf-8") as f:

Maintenant je voudrais rétroporter ce code à Python 2.x, de sorte que j'aurais une base de code qui fonctionne avec Python 2 et Python 3.

Quelle est la stratégie recommandée pour contourner open() différences open() et le manque de paramètre d'encodage?

Pourrais-je avoir un gestionnaire de fichier de style Python 3 open() qui diffuse des bytestrings, donc il agirait comme Python 2 open() ?

https://src-bin.com


Answer #1

1. Pour obtenir un paramètre d'encodage dans Python 2:

Si vous avez seulement besoin de supporter Python 2.6 et 2.7, vous pouvez utiliser io.open au lieu d' open . io est le nouveau sous-système io pour Python 3, et il existe aussi en Python 2,6 et 2,7. S'il vous plaît soyez conscient que dans Python 2.6 (ainsi que 3.0), il est mis en œuvre purement en python et très lent, donc si vous avez besoin de vitesse dans la lecture des fichiers, ce n'est pas une bonne option.

Si vous avez besoin de vitesse, ou si vous avez besoin de supporter Python 2.5 ou une version antérieure, vous pouvez utiliser codecs.open place. Il a également un paramètre de codage, et est assez similaire à io.open sauf qu'il gère différemment les fins de ligne.

2. Pour obtenir un gestionnaire de fichiers de style Python 3 open() qui diffuse des octets:

open(filename, 'rb')

Notez le «b», ce qui signifie «octets».


Answer #2

Cela peut faire l'affaire:

import sys
if sys.version_info[0] > 2:
    # py3k
    pass
else:
    # py2
    import codecs
    import warnings
    def open(file, mode='r', buffering=-1, encoding=None,
             errors=None, newline=None, closefd=True, opener=None):
        if newline is not None:
            warnings.warn('newline is not supported in py2')
        if not closefd:
            warnings.warn('closefd is not supported in py2')
        if opener is not None:
            warnings.warn('opener is not supported in py2')
        return codecs.open(filename=file, mode=mode, encoding=encoding,
                    errors=errors, buffering=buffering)

Ensuite, vous pouvez garder le code de la façon python3.

Notez que certaines API comme closefd , closefd , opener ne fonctionnent pas


Answer #3

Voici une façon:

with open("filename.txt", "rb") as f:
    contents = f.read().decode("UTF-8")

Answer #4

je pense

from io import open

devrait faire.





python-3.x