「PythonのUnicodeDecodeErrorの対処方法」の版間の差分
提供: Python入門
(ページの作成:「PythonのHTMLParserを使用して、HTMLをパースしていたときに UnicodeDecodeError(ユニコード デコード エラー) のエラーに遭遇しました。...」) |
|||
(同じ利用者による、間の2版が非表示) | |||
行7: | 行7: | ||
== 概要 == | == 概要 == | ||
以下のエラーメッセージが出現しました。 | 以下のエラーメッセージが出現しました。 | ||
+ | UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6: | ||
+ | ordinal not in range(128) | ||
+ | == UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128) == | ||
+ | === エラーが起きたとき === | ||
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6: | UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6: | ||
ordinal not in range(128) | ordinal not in range(128) | ||
行28: | 行32: | ||
File "/usr/local/lib/python2.7/re.py", line 151, in sub | File "/usr/local/lib/python2.7/re.py", line 151, in sub | ||
return _compile(pattern, flags).sub(repl, string, count) | return _compile(pattern, flags).sub(repl, string, count) | ||
− | UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128) | + | UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6: |
+ | ordinal not in range(128) | ||
Exit 1 | Exit 1 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == | + | |
+ | === 解決方法 === | ||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
foo ( str ); | foo ( str ); | ||
行40: | 行46: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
とするだけで、解決しました。 | とするだけで、解決しました。 | ||
+ | == UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-6: ordinal not in range(128) == | ||
+ | === エラーが起きたとき === | ||
+ | 出力をリダイレクトしない場合は、問題にならなかったのですが、リダイレクトした瞬間に | ||
+ | UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-6: | ||
+ | ordinal not in range(128) | ||
+ | とエラーが出るようになりました。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | % python ./parse.py < foo.txt | ||
+ | % python ./parse.py < foo.txt > bar.txt | ||
+ | Traceback (most recent call last): | ||
+ | File "./parse.py", line 210, in <module> | ||
+ | parser.feed(html.decode('utf-8') ) | ||
+ | File "/usr/local/lib/python2.7/HTMLParser.py", line 108, in feed | ||
+ | self.goahead(0) | ||
+ | File "/usr/local/lib/python2.7/HTMLParser.py", line 150, in goahead | ||
+ | k = self.parse_endtag(i) | ||
+ | File "/usr/local/lib/python2.7/HTMLParser.py", line 319, in parse_endtag | ||
+ | self.handle_endtag(tag.lower()) | ||
+ | File "./parse.py", line 128, in handle_endtag | ||
+ | print self.expression, ",", self.meaning, | ||
+ | UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-6: ordinal not in range(128) | ||
+ | Exit 1 | ||
+ | </syntaxhighlight> | ||
+ | === 解決方法1 === | ||
+ | 出力先が端末、ファイルに関わらず、特定のエンコーディングで出力したい場合は、標準出力で書き換えてしまうのが簡単です。 | ||
+ | <syntaxhighlight lang="python"> | ||
+ | import sys, codecs | ||
+ | sys.stdout = codecs.getwriter("utf-8")(sys.stdout) | ||
+ | </syntaxhighlight> | ||
+ | === 解決方法2 === | ||
+ | 解決方法1で解決しなかった場合は、コードの変更はなく、環境変数を設定するだけで対応できました。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | env LC_ALL=en_US.UTF-8 /usr/bin/python ./doit.py | ||
+ | </syntaxhighlight> | ||
== 関連項目 == | == 関連項目 == | ||
* [[Pythonでのエンコードとデコード]] | * [[Pythonでのエンコードとデコード]] | ||
<!-- vim: filetype=mediawiki | <!-- vim: filetype=mediawiki | ||
--> | --> |
2018年5月23日 (水) 22:30時点における最新版
PythonのHTMLParserを使用して、HTMLをパースしていたときに UnicodeDecodeError(ユニコード デコード エラー) のエラーに遭遇しました。UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128)
読み方
- UnicodeDecodeError
- ゆにこーど でこーど えらー
目次
概要
以下のエラーメッセージが出現しました。
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128)
エラーが起きたとき
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128)
ASCII(アスキー)をデコードしようと思ったけど、できなかった、ということのようです。
プログラムを実行するとこのようになります。
$ python parse.py Traceback (most recent call last): File "parse.py", line 210, in <module> parser.feed(html) File "/usr/local/lib/python2.7/HTMLParser.py", line 108, in feed self.goahead(0) File "/usr/local/lib/python2.7/HTMLParser.py", line 148, in goahead k = self.parse_starttag(i) File "/usr/local/lib/python2.7/HTMLParser.py", line 252, in parse_starttag attrvalue = self.unescape(attrvalue) File "/usr/local/lib/python2.7/HTMLParser.py", line 393, in unescape return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));", replaceEntities, s) File "/usr/local/lib/python2.7/re.py", line 151, in sub return _compile(pattern, flags).sub(repl, string, count) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128) Exit 1
解決方法
foo ( str );
なところを
foo ( str.decode('utf-8') );
とするだけで、解決しました。
UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-6: ordinal not in range(128)
エラーが起きたとき
出力をリダイレクトしない場合は、問題にならなかったのですが、リダイレクトした瞬間に
UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-6: ordinal not in range(128)
とエラーが出るようになりました。
% python ./parse.py < foo.txt % python ./parse.py < foo.txt > bar.txt Traceback (most recent call last): File "./parse.py", line 210, in <module> parser.feed(html.decode('utf-8') ) File "/usr/local/lib/python2.7/HTMLParser.py", line 108, in feed self.goahead(0) File "/usr/local/lib/python2.7/HTMLParser.py", line 150, in goahead k = self.parse_endtag(i) File "/usr/local/lib/python2.7/HTMLParser.py", line 319, in parse_endtag self.handle_endtag(tag.lower()) File "./parse.py", line 128, in handle_endtag print self.expression, ",", self.meaning, UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-6: ordinal not in range(128) Exit 1
解決方法1
出力先が端末、ファイルに関わらず、特定のエンコーディングで出力したい場合は、標準出力で書き換えてしまうのが簡単です。
import sys, codecs sys.stdout = codecs.getwriter("utf-8")(sys.stdout)
解決方法2
解決方法1で解決しなかった場合は、コードの変更はなく、環境変数を設定するだけで対応できました。
env LC_ALL=en_US.UTF-8 /usr/bin/python ./doit.py