2016-08-21 15 views
1

これはPython 2.7では動作しますが、3.5では動作しません。NameError:名前 'file'が定義されていません

def file_read(self, input_text): 

    doc = (file.read(file(input_text))).decode('utf-8', 'replace') 

このファイルを開こうとしていますが、input_textはargparseのパス値です。

このエラーが発生します。

NameError: name 'file' is not defined 

私は、Python 3.5は、代わりに「ファイル」の「オープン」を使用して、私は非常にこのような状況では、オープンを使用する方法を取得しないことを集めます。

+2

と何 'strのオブジェクトを実行しても何の属性を持っていない「読み」 「これと関係がありますか? –

+1

私は人々が負の評判を提供することで銃で少し遅くなることを望みます。ちょうどここで始めて、物事を台無しにしようとしないでください。 –

+0

@FredZimmermanはい私はあなたに同意します –

答えて

3

オリジナルのコードはPython 2.7で動作しますが、そこでは悪いスタイルです。この使用のためのfileは、長い時間前には、openを使用することになっていましたが、file.readを引数として渡すのではなく、返されたオブジェクトに対して.readメソッドを呼び出すだけでした。モードなしopenは今のUnicodeテキストを読むには、デフォルトになるので

あなたは、Python 2で行ったコードを書くための正しい方法は、

with open(input_text) as docfile: 
    doc = docfile.read().decode('utf-8', 'replace') 

これは、Python 3でそのように動作しませんがされているだろう。さらに、ファイルがネイティブエンコーディングであり、strictエラー処理でそれをデコードすると仮定します。しかし、Pythonの3が実際にあなたがopen自体に引数としてエンコードおよびエラー動作を渡すことができますよう、Pythonの2に比べて簡単にテキストファイルでの作業になり:

with open(input_text, encoding='utf-8', errors='replace') as docfile: 
    doc = docfile.read() 
関連する問題