2011-11-20 9 views
0

UnicodeDecodeErrorを解決する方法を知ってはいけない:のpython、コーデック、file.writelines()、UnicodeDecodeError

私がファイルにテキストを書き込むことができないです - 文字â = '0xe2'について>UnicodeDecodeErrorを。確かに

1)â = '0xe2'文字が

2)re.search)が定義されているがfile.writelines(string)

3を書き込むための私がしようとしています文字列、中â文字を見つけることができない、その文字列内に存在しません。ファイルオープン時のerrors='replace'であるため、file.writelines()は文字エラーについては不平を言ってはいけません。あなたが使用しているcodecs.open

File=codecs.open(fname, 'w','utf-8', errors='replace') 

lines=smart_str(lines, 'utf-8', strings_only=False, errors='replace') 
# lines is 'some webpage text after BeautifulSoup.prettify which does not contain letter â ='0xe2', which is converted with Django smart_str to string' 

FileA.writelines(lines) #gives UnicodeDecodeError : 'ascii' codec can't decode byte 0xe2 in position 9637: ordinal not in range(128). 

myre = re.compile(r'0xe2', re.UNICODE) # letter â = '0xe2' 
print re.search(myre, lines) #gives None 
linessub=myre.sub('', lines) 
print re.search(myre, linessub) #gives None 

FileA.writelines(lines) #gives UnicodeDecodeError : 'ascii' codec can't decode byte 0xe2 in position 9637: ordinal not in range(128). 
+0

あなたは文字列が部分文字列を含んでいるかどうかをテストしたい場合は、ちょうど 'の代わりに' '0xe2ので、とにかく動作しません。この 're'もの、のS'では「\ XE2」を実行します。ただ、これを試してみてください'!=' \ xe2''。 – yak

答えて

3

ので、あなたのファイルオブジェクトは、Unicode文字列ではなく、バイト文字列を期待しています。

この関数を使用する際のポイントは、ファイルに書き込む前に文字列をエンコードする必要がないことです。ユニコード文字列を書くと、ファイルオブジェクトはそれらを内部的にエンコードします。

smart_strは、UTF-8でエンコードされた文字列を返すように見えます(エンコード名を渡すとわかります)。ユニコードを予期しているコーデック対応のファイルオブジェクトに渡すと、最初にバイト列をユニコードにデコードしようとします。渡された文字列のエンコーディングがわからないため、asciiを使用します。文字列はASCIIではないので、それはエラーがどこから来る、それはUTF-8ですです:だから

UnicodeDecodeError : 'ascii' codec can't decode... 

、あなたはsmart_strによって行わエンコードの段階を省略し、単にファイルにUnicode文字列を書きたい、または、 codecs.open()から通常のopen()に切り替わります。これはバイトで動作し、既にエンコードされたバイト文字列を想定しています。

ところで、0xE2文字の存在のテストは機能しません。まず、r'0xe2'をパターンとして使用します。パターンは単純に4文字の文字列であり、1つの0xE2文字ではありません。第二に、そのような単純なもののためにreは必要ありません。

print '\xe2' in your_str 
+0

問題は、文字「文字」について「UnicodeDecodeError」を解決する方法です。文字「行」をファイルに書き込もうとすると表示されます。 –

+0

私はこの文字がテキストに存在しないことを意味します。どのようにそのようなエラーが発生し、私はそれについて何をすべきか? –

+0

ファイルに書き込む前に文字列の検索を実行するので、smart_strが必要です。ここには示されていません。私はこれらのエラーを取得していると私は任意のファイルに文字列を書くことはできません、どちらもオープンしていないか、開いていないか、codecs.open(...)で開かれた。 –

関連する問題