14

私は、UTF-8およびUTF-16エンコーディングのファイルを開くことができなければならないPythonツールに取り組んでいます。Python 3.2では、次のコードを使用してUTF-8を使用してファイルを開こうとし、Unicodeエラーが発生した場合はUTF-16で試してみます。

def readGridFromPath(self, filepath):
    try:
        self.readGridFromFile(open(filepath,'r',encoding='utf-8'))
    except UnicodeDecodeError:
            self.readGridFromFile(open(filepath,'r',encoding='utf-16'))

readGridFromFile最後まで実行するか、を上げますUnicodeDecodeError。)

ただし、このコードをPython 2.xで実行すると、次のようになります。

TypeError: 'encoding' is an invalid keyword argument for this function

ドキュメントで、Python2.xにはキーワードopen()がないことがわかります。encodingこれを回避して、コードをPython 2.xと互換性のあるものにする方法はありますか?

4

1 に答える 1

21

io.openはニーズに合わせたドロップイン置換であるため、提供したコードサンプルはPython2.xでは次のようになります。

import io

def readGridFromPath(self, filepath):
    try:
        self.readGridFromFile(io.open(filepath, 'r', encoding='utf-8'))
    except UnicodeDecodeError:
        self.readGridFromFile(io.open(filepath, 'r', encoding='utf-16'))


io.openここで詳細に説明します。そのプロトタイプは次のとおりです。

io.open(file、mode ='r'、buffering = -1、encoding = None、errors = None、newline = None、closefd = True

ioモジュール自体は、Python2.xとPython3.xの間の互換性レイヤーとして設計されており、Py3kへの移行を容易にし、既存のPython2.xコードのバックポートとメンテナンスを簡素化します。

また、バイナリモードでのみcodecs.open機能するため、を使用すると警告が発生する可能性があることに注意してください。

注:バイナリモードが指定されていない場合でも、ファイルは常にバイナリモードで開かれます。これは、8ビット値を使用したエンコードによるデータ損失を回避するために行われます。これは、読み取りと書き込みで'\n'`の自動変換が行われないことを意味します。

また、UTF8 BOMを手動で検出して削除する問題が発生する可能性がありますcodecs.open—UTF8BOMを文字としてインラインのままにしu'\ufeff'ます。

于 2012-04-07T21:57:46.227 に答える