2016-09-22 14 views
0

を働いていない私はこのコードを持ってPythonのコーデックはエンコーディング

import collections 
import csv 
import sys 
import codecs 
from xml.dom.minidom import parse 
import xml.dom.minidom 

String = collections.namedtuple("String", ["tag", "text"]) 

def read_translations(filename): #Reads a csv file with rows made up of 2 columns: the string tag, and the translated tag 
    with codecs.open(filename, "r", encoding='utf-8') as csvfile: 
     csv_reader = csv.reader(csvfile, delimiter=",") 
     result = [String(tag=row[0], text=row[1]) for row in csv_reader] 
    return result 

私が読んでいるCSVファイルには、ポルトガル語(ブラジル)文字が含まれています。これを実行しようとすると、エラーが発生します。

'utf8' codec can't decode byte 0x88 in position 21: invalid start byte 

私はPython 2.7を使用しています。ご覧のとおり、私はコーデックでエンコードしていますが、動作しません。

アイデア?

+2

ファイルがUTF-8として保存されていない可能性がありますか? – zvone

+1

'encoding = 'utf-8''を' encoding =' cp1252''に変更してみてください。私たちは、データを見ることなく多くを伝えることはできません。 – wim

+0

それらの人は何を言った。あなたが強制しない限り、WindowsはUTF-8を使用しません。開いている任意のランダムファイルは、現在のWindowsコードページでエンコードされる可能性が最も高いでしょう。あなたは 'encoding = 'mbcs''を使って、それが何であるかを知らなくてもそれを得ることができます。 –

答えて

-1

このラインの考え方:「このファイルはUTF-8で保存されたそれからの読み取り時に適切な変換をしてください。」

with codecs.open(filename, "r", encoding='utf-8') as csvfile: 

が言うことです

ファイルがutf-8として実際に保存されていれば問題ありません。他のエンコーディングが使用された場合、それは悪いです。

何ですか?

どのエンコードが使用されたかを決定します。ファイル推測を作成したソフトウェアから情報を得ることができないと仮定します。

開き、通常のファイルと印刷の各ライン:

with open(filename, 'rt') as f: 
    for line in f: 
     print repr(line) 

が続いてASCII以外の文字を探して、例えば-N - この手紙は、それはそれのためにUTF-8配列であるので、例えば:

'espa\xc3\xb1ol' 

以上、nは\xc3\xb1として表され、いくつかのコードとして印刷されます。

>>> ntilde = u'\N{LATIN SMALL LETTER N WITH TILDE}' 
>>> 
>>> print repr(ntilde.encode('utf-8')) 
'\xc3\xb1' 
>>> print repr(ntilde.encode('windows-1252')) 
'\xf1' 
>>> print repr(ntilde.encode('iso-8859-1')) 
'\xf1' 
>>> print repr(ntilde.encode('macroman')) 
'\x96' 

や印刷、それらのすべて:

for c in encodings.aliases.aliases: 
    try: 
     encoded = ntilde.encode(c) 
     print c, repr(encoded) 
    except: 
     pass 

を次に、あなたはそれがエンコードされ推測しているとき

さて、あなたは右である与えると見ることが様々なものをエンコーディング確認することができますそれを使用してください。例:

with codecs.open(filename, "r", encoding='iso-8859-1') as csvfile: 
関連する問題