質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

4607閲覧

python3.5系 のopen関数でEUC_JPのファイルをwindowsコマンドプロンプト上で読み込む。

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2017/01/11 10:14

編集2022/01/12 10:55

python

1""" 2windows上のコマンドプロンプトでとある、EUC_JPで記述されたテキストファイルをpython3.5の 3組み込みopen関数で開こうと下記のように記述いたしました 。 4""" 5 6sqlPath = "C:\\Users\\○○○○\\Downloads\\○○○○.sql" 7fp = open(sqlPath, mode="r", encoding="EUC_JP"); 8for temp in fp: 9 print(temp); 10 11""" 12上記のコードを実行したところ、 13 14Traceback (most recent call last): 15 File "experience.py", line 6, in <module> 16 print(temp); 17UnicodeEncodeError: 'cp932' codec can't encode character '\xe9' in position 62: illegal multibyte sequence 18上記の例外が出たため、以下のように記述しなおなして再度実行しました。 19""" 20 21sqlPath = "C:\\Users\\○○○○\\Downloads\\○○○○.sql" 22fp = open(sqlPath, mode="r", encoding="EUC_JP", errors="ignore"); 23for temp in fp: 24 print(temp); 25 26''' 27上記のコードのようにopen関数にerrorsキーワード引数にEUCから復号できない場合は 28無視をするというerrors="ignore"という引数を含めて実行したところやはり 29Traceback (most recent call last): 30 File "experience.py", line 27, in <module> 31 print(temp); 32UnicodeEncodeError: 'cp932' codec can't encode character '\xe9' in position 62: illegal multibyte sequence 33上記の例外が発生しました。 34この場合、どうやったらUnicodeEncodeErrorをださずにファイルの中身を読み込めるでしょうか? 35'''

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyahan

2017/01/12 05:36

質問事項(本文)とプログラムのコードは分けて記述してください。
guest

回答1

0

テキストファイル(EUC-JP)を読み込んでユニコード文字列に変換するのはうまくいっています。ですので open で errors="ignore" を指定しても何も変わりません。

問題はユニコード文字列を print するときで、コマンドプロンプトの文字コード(CP932)に存在しない文字(上記の例だと é)を変換しようとして UnicodeEncodeError になっています。

CP932(Shift-JIS)を使うことはトラブルの元になるので、個人的にコマンドプロンプトの文字コードを UTF-8 にしたほうがよいと思います。

「いや、文字情報が壊れても良いからとりあえずテキストファイルの中身をざっくり表示させたい」というのであれば、無理矢理ですが次のようにすればエラーを回避できます。

python

1for temp in fp: 2 print(temp.encode('cp932', errors='replace').decode('cp932'))

投稿2017/01/12 05:18

編集2017/01/12 05:31
miyahan

総合スコア3095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/01/12 12:07 編集

ご回答ありがとうございます。 >テキストファイル(EUC-JP)を読み込んでユニコード文字列に変換するのはうまくいっています。>ですので open で errors="ignore" を指定しても何も変わりません。 上記の、なんら変化しない点については、EUC-JPのファイルを読み込む際に、内部的にUnicodeへ変換する際、つまり「EUC-JP=>Unicodeへの変換時」のUnicodeDecodeErrorを「無視」するためのキーワード引数という認識でよろしいでしょうか? また、当該の件のUnicodeEncodeErrorについては、windowsのコマンドプロンプトがデフォルトで仕様上CP932になっている以上、Unicode=>CP932へのエンコードが発生し、その際のエラーということですね。 python3は内部ではUnicodeのコードポイントで文字列を管理していると思いますが、 出力する際にはpythonのエンジンが自動でencode処理をかけているという認識でよろしいでしょうか?
miyahan

2017/01/12 12:41

>「EUC-JP=>Unicodeへの変換時」のUnicodeDecodeErrorを「無視」するためのキーワード引数 その通りです。ただ厳密には UnicodeDecodeError と UnicodeEncodeError の両方を無視するオプションです。(今回はファイルの読み込みだけですが、書き込む場合もあるので) > Unicode=>CP932へのエンコードが発生し、その際のエラー その通りです。 > 出力する際にはpythonのエンジンが自動でencode処理をかけている その通りです。その際のコーデックは `sys.getdefaultencoding()` で確認できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問