2016-05-02 5 views
-1

私はdictsのリストをlatin-1でエンコードされたファイルに出力しようとしています。各フィールドには、ASCII文字254によって分離されると、行の最後には、私は128よりも大きい文字を使用しようとすると、私はこれが私です「UnicodeDecodeError: 'ascii' codec can't decode byte 0xfe in position 12: ordinal not in range(128)Pythonの文字にASCII番号を使用する

を取得ASCII文字20

する必要があります現在のコード。 ASCIIのchar 254をエンコードする方法と、DictWriterを使用するときに行末のASCII char 20を追加する方法を教えてください。

おかげ 私のコード:

with codecs.open("test.dat", "w", "ISO-8859-1") as outputFile: 

     delimiter = (chr(254)) 
     keys = file_dict[0].keys() 
     dict_writer = csv.DictWriter(outputFile, keys, delimiter=delimiter) 
     dict_writer.writeheader() 
     for value in file_dict: 
      dict_writer.writerow(value) 
+0

オープンファイル 'でファイル=( "test.txtの"、 "W"、「UTF codecs.open -8 ")'。 – EbraHim

+0

可能であれば、Python 3を使用してください。 – mhawke

+0

Python2.xを使用していることを確認できますか? Python2と3はここでは異なるイディオムを持っています... –

答えて

0

ASCII文字コード0〜127のみを含んでいません。

128〜255の範囲のコードは、ASCIIで定義されていませんが、ANSI、latin-1、またはすべてのUnicodeのように、コードを拡張するコーデックでのみ定義されます。

おそらく、文字列を何とかダブルエンコードしていると失敗します。

あなたは組み込みのopen機能コーデックを指定せずに標準を使用する場合、それは動作します:

with open("test.dat", "w") as outputFile: # omit the codec stuff here 
    delimiter = (chr(254)) 
    keys = file_dict[0].keys() 
    dict_writer = csv.DictWriter(outputFile, keys, delimiter=delimiter) 
    dict_writer.writeheader() 
    for value in file_dict: 
     dict_writer.writerow(value) 
+0

あなたはほぼ正しいです。 codecsモジュールはUnicode出力を期待しているので、最初にchr(254)文字を含むバイト文字列を変換しようとし、デフォルトの変換がasciiであるためUnicodeDecodeErrorで失敗します。だから、二重エンコーディングの問題ではなく、コーデックで必要なUnicodeへの変換です。 –

+0

しかし、私はコーデックを削除するとISO-8859-1のファイルが必要ですが、それ以外のファイルをどのようにエンコードできますか? writerowにエンコードを追加すると、Nonetype cannptがエンコードされます。また、どうすれば "END OF LINE"アスキー文字を追加できますか? – sipra287

関連する問題