174

Python 3用に構築されたPythonコードベースがあります。これは、エンコーディングパラメータでPython 3スタイルのopen()を使用します。

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

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

ここで、このコードをPython 2.xにバックポートして、Python2とPython3で動作するコードベースを作成したいと思います。

open()エンコーディングパラメータの違いと欠如を回避するために推奨される戦略は何ですか?

バイト文字列をストリーミングするPython3スタイルのファイルハンドラーを使用できますか? open()Python 2のように動作しopen()ますか?

4

6 に答える 6

187

1. Python 2でエンコーディングパラメータを取得するには:

Python 2.6および2.7のみをサポートする必要がある場合は、io.openの代わりに使用できますopenioはPython3の新しいioサブシステムであり、Python2,6および2.7にも存在します。Python 2.6(および3.0)では、Pythonは純粋にPythonで実装されており、非常に遅いため、ファイルの読み取り速度が必要な場合は、適切なオプションではないことに注意してください。

速度が必要で、Python 2.6以前をサポートする必要がある場合は、codecs.open代わりに使用できます。また、エンコーディングパラメータがあり、io.open行末の処理方法が異なることを除けば、非常によく似ています。

2.open()バイト文字列をストリーミングするPython3スタイルのファイルハンドラーを取得するには、次の手順に従います。

open(filename, 'rb')

「バイナリ」を意味する「b」に注意してください。

于 2012-06-11T06:32:41.383 に答える
68

おもう

from io import open

する必要があります。

于 2012-06-10T18:04:28.777 に答える
29

これが1つの方法です:

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

書くときに同じことをする方法は次のとおりです。

with open("filename.txt", "wb") as f:
    f.write(contents.encode("UTF-8"))
于 2016-11-17T15:38:29.917 に答える
9

これでうまくいくかもしれません:

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)

次に、python3の方法でコードを保持できます。

、、などnewlineの一部のAPIは機能しないことに注意してくださいclosefdopener

于 2014-11-21T10:13:05.040 に答える
2

を使用している場合はsix、これを試すことができます。これにより、最新のPython 3 APIを利用し、Python2/3の両方で実行できます。

import six

if six.PY2:
    # FileNotFoundError is only available since Python 3.3
    FileNotFoundError = IOError
    from io import open

fname = 'index.rst'
try:
    with open(fname, "rt", encoding="utf-8") as f:
        pass
        # do_something_with_f ...
except FileNotFoundError:
    print('Oops.')

そして、Python 2のサポートの放棄は、に関連するすべてのものを削除するだけsixです。

于 2019-06-10T04:51:25.233 に答える
0

一般的な答えではありませんが、デフォルトのpython 2エンコーディングには満足しているが、python3にutf-8を指定したいという特定の場合に役立つ場合があります。

if sys.version_info.major > 2:
    do_open = lambda filename: open(filename, encoding='utf-8')
else:
    do_open = lambda filename: open(filename)

with do_open(filename) as file:
    pass
于 2020-08-04T14:00:50.743 に答える