2013-06-02 11 views
6

私はこれを持っていますmyfile(これは私が貼り付けた、私は問題の関連データがコピー/貼り付けを生き延びたことを願っています)。私は、そのファイルを読み取ろう:"Cソース、ISO-8859テキスト"を読む方法

import codecs 
codecs.open('myfile', 'r', 'utf-8').read() 

しかし、これは与える:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xe5 in position 7128: invalid continuation byte 

を、私は、ファイルをチェックした場合:

» file myfile 
myfile: C source, ISO-8859 text 
  • 私は、ファイルのようなものを(読むことができますどのようにISO-8859)をPythonで使用していますか?
  • 一般的に、ファイルがどのようにエンコードされているかをどのように知ることができますか?

私が生成していないファイル(システムファイル、インターネットからダウンロードしたランダムファイル、プロバイダ、顧客などが提供するランダムファイル)を扱っています:これらのファイルは提供していません彼らが使っているエンコーディングの手掛かりです。多文化環境(ヨーロッパ)にあるため、これらのファイルがどのようにコード化されているかを知ることは困難です。ほとんどの場合、ファイルを提供している人さえもエンコーディングについての手掛かりはありません。エンコーディングについてのヒントは、エディタ/選択したツールによって舞台裏で起こることがあります。使用されているエンコーディングをファイル単位で確認するにはどうすればよいですか?

+0

にあなたはとのトラブルを持っていたバイトが保持されませんでしたpastebin.comに置くファイルを構築して使用することができます。 –

+0

奇妙な:視覚検査は、彼らがそこにいると伝えます(ライン151) – dangonfast

+0

ああ、確かに、データはUTF8でエンコードされているので、ラテン1エンコーディングは気にしないでファイルを開いたし、UTF8も失敗しませんでした。 :-)あなたのブラウザは、それ自体の推測者を使用した後、エンコーディングを調整しているに違いありません。 –

答えて

9

open()コマンドでコーデックを変更しました。 ISO-8859規格は複数のコーデックを持って、私はここにあなたのためのラテン-1を選んだが、あなたは別のものを選択する必要があります。

codecs.open('myfile', 'r', 'iso-8859-1').read() 

は、有効なコーデックのリストについては、codecs moduleを参照してください。ペストリーのデータで判断すると、スカンジナビア語のテキストに適しているため、iso-8859-1は正しいコーデックです。

一般に、他のソースがないと、ファイルが使用するコーデックを知ることができません。せいぜい、あなたは推測することができます(それはfileのことです)。

+0

ありがとうございます。これは本当に残念です。これはユニコードの設計上の欠陥ですか?つまり、エンコードされたファイルを持っているのですが、エンコーディングがどのエンコーディングを使用しているかを伝える方法がないと、私は重大な欠点に遭遇します。私のツールをプロダクションで実行すると、手動でコーデックを変更することはできません。 'file:encoding'の*別の*マッピングを維持する必要がありますか?私はいつも*可能なコーデックのリストを試してみるべきですか?偽陽性がありますか? – dangonfast

+0

これはUnicodeとは関係ありません。使用されるコーデックを含まないファイル形式の欠陥です。すべてのコーデックを試してみると、正しいコーデックを実際に打つよりも、間違いがあると思われます。より教育的な推測をしようとするために['chardet'](https://pypi.python.org/pypi/chardet)を使うことができます。 –

+0

Mmmm。右。ユニコードを使用している場合のファイルフォーマット*の脆弱性。非Unicodeファイルを開く* never *は問題を引き起こします。どちらが(間違っていますか?)私にユニコードが原因だと感じています。使用しているコーデックについての情報が埋め込まれていない状態で、ユニコードでエンコードされたファイルの配布を開始するのは誤りです。 – dangonfast

8

は、Python 3.3を使用すると、開いている機能

open("myfile",encoding="ISO-8859-1") 
+1

この簡単な解決策を見つけるのに15時間のグーグルが必要でした。ありがとう! –

関連する問題