2012-03-27 13 views
1

私は正直なところこれに多くの時間を費やしており、ゆっくりと私を殺しています。 PDFからコンテンツを取り除き、配列に格納しました。今私はそれを配列から引き出し、それをtxtファイルに書き込もうとしています。しかし、私はエンコードの問題のために起こるように思われません。Pythonエンコーディングテキストファイルに書き込むためのデコード

allTheNTMs.append(contentRaw[s1:].encode("utf-8")) 
for a in range(len(allTheNTMs)): 
     kmlDescription = allTheNTMs[a] 
     print kmlDescription #this prints out fine 
     outputFile.write(kmlDescription) 

私は取得していますエラーが「unicodedecodeerrorです:アスキーコーデックは、位置213でのバイトに0xC2をデコードすることはできません:序ない範囲(128)に

私はちょうど今いじりんだけど、私は書き出すためにこのようなものを取得する方法のすべての種類を試してみた。

outputFile.write(kmlDescription).decode('utf-8')   

これは基本的であるならば、私はまだ(2.7)はPythonを学んでいる私を許してください。

乾杯!

EDIT1:サンプルデータは、次のようになります。

Chart 3686 (plan, Morehead City) [ previous update 4997/11 ] NAD83 DATUM 
Insert the accompanying block, showing amendments to coastline, 
depths and dolphins, centred on: 34° 41´·19N., 76° 40´·43W. 
Delete R 34° 43´·16N., 76° 41´·64W. 

私はプリントタイプ(生)を追加すると、私は編集2

を得る:私はちょうどデータを書き込むしようとすると、私は元のエラーメッセージを受け取る(アスキーコーデックはバイトをデコードできません...)

私は提案されたスレッドとビデオをチェックアウトします。ありがとうございました!

編集3:私は、Python 2.7

編集4を使用していますが:(S)、彼は私がダブルエンコーディングだったことに気づいたとき、AGFは、以下のコメントで頭の上に釘を打ちます。私は以前に働いていた文字列を意図的に二重にエンコードしようとしましたが、最初にスローされたのと同じエラーメッセージが生成されました。ような何か:

text = "Here's a string, but imagine it has some weird symbols and whatnot in it - apparently latin-1" 
textEncoded = text.encode('utf-8') 
textEncodedX2 = textEncoded.encode('utf-8') 
outputfile.write(textEncoded) #Works! 
outputfile.write(textEncodedX2) #failed 

私は解決策は以下の通りであった、私は二重のエンコードにしようとしていた考え出したら:

allTheNTMs.append(contentRaw[s1:].encode("utf-8")) 
for a in range(len(allTheNTMs)): 
    kmlDescription = allTheNTMs[a] 
    kmlDescriptionDecode = kmlDescription.decode("latin-1") 
    outputFile.write(kmlDescriptionDecode) 

それは今働いている、と私は確信してあなたの助けのすべてに感謝!

+2

問題のあるサンプルデータを入力してください。 "type(raw_data)"を実行し、あなたの質問に結果を貼り付けてください。 – pylover

+1

'contentRaw'を'書き込み 'しようとするとどうなりますか?データがすでにエンコードされているように見えます。 – agf

+0

私はいくつかの同じ問題を 'codecs'モジュール、特に' codecs.open() 'と' codecs.write() 'で解決しました。見てみる価値があるかもしれません。 – heltonbiker

答えて

1

あなたのエラーメッセージはあなたのPython構文とは関係ないようですが、実際にはあなたがUTF-8で同等のものを持たないHex値をデコードしようとしているという事実です。

HEX 0xc2は、ラテン文字を表すように見えます - 上にアクセントを付けた大文字のAです。そのため、代わりに"allTheNTMs.append(。contentRaw [S1:](エンコード" UTF-8を使用しての "))"、試してみてください -

allTheNTMs.append(contentRaw[s1:].encode("latin-1")) 

かもしれないこれはので、私は、Pythonの専門家ではありませんよあなたはラテン文字をエンコードしようとしているようです。あなたが受け取っているエラーメッセージがあれば、UTF-8でエンコードしようとすると、「0XC2」というエントリが実際には範囲外であることを示すエラーが表示された場合、Pythonは最初の128個のエントリを調べますUTF-8の最初の128エントリのうち、

+1

UTF-8はユニコードコードポイントを表すことができるので、ターゲットエンコーディングではなく、データを二重エンコードしようとしているという問題があります。 – agf

+0

これは間違っています。彼は** '.encode' **メソッドを呼び出し、Unicode ** Decode ** Errorを取得しています。つまり、python2の暗黙的なstr/unicode変換が行われます。 – Daenyth

4

私の推測では、それ以外の場合は、あなたが書くことができます正常に開かれたファイルに、それはそれを再変換しようとするので、あなたがそれにutf-8符号化データを書き込むことができませんあなたが開いている出力ファイルが故にlatin1あるいはutf-8コーデックで開かれていることです任意のデータ列は、ここで同様のエラーを再作成する例である

u = u'सच्चिदानन्द हीरानन्द वात्स्यायन ' 
s = u.encode('utf-8') 
f = codecs.open('del.text', 'wb',encoding='latin1') 
f.write(s) 

出力:

Traceback (most recent call last): 
    File "/usr/lib/wingide4.1/src/debug/tserver/_sandbox.py", line 1, in <module> 
    # Used internally for debug sandbox under external interpreter 
    File "/usr/lib/python2.7/codecs.py", line 691, in write 
    return self.writer.write(data) 
    File "/usr/lib/python2.7/codecs.py", line 351, in write 
    data, consumed = self.encode(object, self.errors) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128) 

解決

あなたは

f = open('del.txt', 'wb') 
f.write(s) 

他のオプションは、OUTPUTFILEが正しいコーデックなどで開かれている場合、直接、Unicode文字列をエンコードせずにファイルに書くことである任意のコーデックを設定しない場合、これは、動作します

f = codecs.open('del.text', 'wb',encoding='utf-8') 
f.write(u) 
+0

ありがとうございます - 私はこれを試みただけでエラー "typeerror:エンコーディングはこの関数の無効なキーワード引数です)"を取得します。 Python 3でエンコーディングが開始され、2.7が使用されているようです。私はそれを指定して、私の質問を編集する必要があります。 – gruvn

+0

@gruvn私はPython 2.7を使用していますが、どの関数にエンコーディングを渡していますか? codecs.open –

+0

ああがらくたを使用 - アヌラーグ申し訳ありません - 私がしようとしていた: F =オープン( 'del.text'、 'WB'、エンコード= 'UTF-8') 代わり のF = codecs.open( 'del.text'、 'wb'、encoding = 'utf-8') もう一度見ていきます。 PS:フォーマットして申し訳ありませんが、動作するようにコードタグを取得できません。 – gruvn

関連する問題