web-dev-qa-db-ja.com

Python 3.6でUnicodeDecodeErrorを解決するには?

Python 2.7からPython 3.6。

英語以外のコンテンツを扱うスクリプトがあります。

私は通常、cronを介して、またターミナルでスクリプトを実行します。

Python 2.7スクリプトにUnicodeDecodeErrorがあり、これで解決しました。

# encoding=utf8  
import sys  

reload(sys)  
sys.setdefaultencoding('utf8')

Python 3.6では動作しません。print("Here %s" % (myvar))のような印刷ステートメントがあり、エラーがスローされます。この問題をmyvar.encode("utf-8")に置き換えることで解決できますが、印刷ステートメントごとに書きたくありません。

ターミナルでPYTHONIOENCODING=utf-8を実行しましたが、まだその問題があります。

Python 3.6でUnicodeDecodeErrorの問題を解決するためのより明確な方法はありますか?

python3にutf-8ですべてを印刷するように指示する方法はありますか?私がPython2でやったように?

4
Umair

ロケールが壊れているようですそして別のバイト-> Unicodeの問題があります。 Python 2.7に対して行ったのは、実際の問題を隠すだけのハックです(あなたがreload sysで機能させます)。

ロケールを修正するには、コマンドラインからlocaleと入力してみてください。次のようになります。

LANG=en_GB.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_ALL=

localeは、LANGが正しく設定されているかどうかに依存します。 Pythonは、localeを効果的に使用して、stdoutに書き込むときに使用するエンコーディングを計算します。それがうまくいかない場合は、デフォルトでASCIIになります。

最初にロケールを修正する必要があります。localeエラーの場合は、地域に適した言語パックがインストールされていることを確認してください。

他のすべてが失敗した場合は、常にPythonを設定してPYTHONIOENCODING=UTF-8。もう一度問題を隠蔽するため、これは最後の手段として使用する必要があります。

PythonがPYTHONIOENCODINGを設定した後もエラーをスローしている場合は、スタックトレースを使用して質問を更新してください。暗黙の変換が行われている可能性があります。

12

Pythonのみのソリューションの場合、_sys.stdout_オブジェクトを再作成する必要があります。

_import sys, codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach())
_

この後、通常のprint("hello world")は自動的にUTF-8にエンコードされます。

しかし、なぜあなたの端末がこのような奇妙なエンコーディングに設定されているのかを理解する必要があります(Pythonに採用しようとしているだけです)。

編集:私のテストでは、環境変数LANGの設定を解除すると、stdoutエンコーディングにこの奇妙な設定が生成されました:

_LANG= python3
import sys
sys.stdout.encoding
_

印刷された_'ANSI_X3.4-1968'_。

ですから、LANGを_en_US.UTF-8_のように設定したいと思うかもしれません。端末プログラムがこれを実行していないようです。

1
Alfe

Ubuntu 18.04に基づくDockerコンテナ内でPythonを使用しているときにこの問題が発生しました。これはロケールの問題であるように見えました。Dockerfileに以下を追加することで解決しました:

ENV LANG C.UTF-8
0
Daniel