1

次のようにファイルを開きます。

with open(sourceFileName, 'r', encoding='ISO-8859-1') as sourceFile:

しかし、私が

previousLine = linecache.getline(sourceFileName, i - 1)

例外が発生します

"UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 169: 
invalid start byte

これは、(私が思うに) str() (メソッドlinecache.getlineを持たない) を返すためです。decode()

スクリプトは Unicode をサポートできる必要があるため、入力ファイルを単純に UTF-8 に変換することはできません。

4

1 に答える 1

4

linecache使用法が示すように、ファイル オブジェクトではなくファイル名を取ります。エンコーディングの規定はありません。また、ドキュメントから:

これは、フォーマットされたトレースバックに含めるソース行を取得するために、トレースバック モジュールによって使用されます。

これは、主に Python ソース コードに使用されることを意味します。結局のところ、ファイルに Python ソース ファイルのエンコーディング コメントがある場合は、次のように機能します。

入力.txt

# coding: iso-8859-1
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ
[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»
¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

test.py

import linecache
print(linecache.getline('input.txt', 3))

出力

[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»

したがってlinecache、おそらくあなたの問題の解決策ではありません。代わりに、示したようにファイルを開き、おそらく自分で行をキャッシュします。

with open('x.txt',encoding='iso-8859-1') as f:
    lines = f.readlines()
print(lines[2])

のように、ファイル全体を読み取りたくない場合は、読み取り時にリストに行を追加することもできますlinecache

于 2015-02-25T16:52:33.253 に答える