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

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

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

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

Q&A

解決済

1回答

2303閲覧

UnicodeDecodeError:'cp932'が発生する!

monolith_91

総合スコア18

Python 3.x

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

0グッド

0クリップ

投稿2017/07/05 23:03

編集2017/07/06 12:59

###前提・実現したいこと
私は、ニュース記事が格納されている特定のフォルダ配下の全てのテキストファイルを読み込んで、
正規表現で、とある表現と一致した箇所だけ抜き出すためのコードを書いております。

###発生している問題・エラーメッセージ
その際、コードを実行すると下記のエラーが発生します。

Traceback (most recant call last): File "<stdin>", line 4, in <module> UnicodeDecodeError:'cp932' codec can't decode byte 0x8f in postion 63: illegal multibyte sequence

###該当のソースコード

import os import re #引数のdirectory配下の全てのファイルパスを取得する関数 def fild_all_files(directory): for root, dirs, files in os.walk(directory): yield root for file in files: yield os.path.join(root, file) #ファイルパスを格納するリスト file_lists_origin = [] file_lists = [] #'F:/リサーチ/ニュース'フォルダ配下のファイルパスだけ、file_lists_originリストに追加する。 for file in fild_all_files('F:/リサーチ/ニュース'): file_lists_origin.append(file) #file_lists_originリストからテキストファイルだけ、file_listsリストに追加する。 for lists in file_lists_origin: if lists.find('txt') > -1: file_lists.append(lists) #欲しい正規表現が入っている箇所だけリストに追加する。 simei = [] page = [] #'F:/リサーチ/ニュース'フォルダ配下のテキストファイルを次々読み込んでいき、正規表現にマッチする箇所だけ、simeiとpageリストに追加していく。 for files in file_lists: file = open(files) string = file.readline() while string: try: match = re.search(r'紙 名:(\w.*)', string) if match: edition = match.group(1) simei.append(edition) match = re.search(r'掲 載 頁:(\d*)', string) if match: p = match.group(1) page.append(p) string = file.readline() except: continue

###試したこと
ネットで調べると、どうもcp932ってshift-jis絡みのエンコードのようで、ネットで見つけた下記解決法を試して駄目でした。

・次のコードをプログラムの最初に書く。
import io, sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,
encoding=sys.stdout.encoding,
errors='backslashreplace',
line_buffering=sys.stdout.line_buffering)

・ファイルを読み込むときに、下記に変える。
file = open(files) ⇒ file = open(files).encode('utf-8')

・正規表現のパターン検索で、下記に変える。
match = re.search(r'紙 名:(\w.)'.encode('utf-8'), string) ⇒ match = re.search(r'紙 名:(\w.)'.encode('utf-8'), string)

###補足情報(言語/FW/ツール等のバージョンなど)
・なお、私が読み込んでいるテキストファイルは次のような形式です。ここから「紙名」と「掲載ページ」を引っ張りたいのです。
掲載年月日:yymmdd
紙 名:掲載メディア
掲 載 頁:掲載ページ
表・写・絵:有り・無し
【記事見出し】
ニュースヘッドライン。
【記事本文】
ニュース本文
-----------------------------------------------------Page 1-----------------------------------------------------
同様のフォーマットが続いていく…。

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

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

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

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

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

quickquip

2017/07/05 23:40

コードは前後の行に ``` に置くなどしてインデントが保存されるようにしてください。エラーはメッセージだけじゃなくて、出ている箇所がわかるように書いてください。
quickquip

2017/07/05 23:42

ソースコードと読み込んでいるファイルが、どんな文字コード(エンコーディング)で保存されているかも必要です。
monolith_91

2017/07/06 04:12

申し訳ありません。ソースのみ急ぎ直しました。出先なんで詳細なエラーについては帰宅してから更新します。また意識してなかったのでテキストファイルのエンコーディングも不明です。済みません…。
monolith_91

2017/07/06 13:08

エラー文も直しました。エラー発生個所は、最下部のループ「for files in file_lists:」からの部分で発生します。また文字コードは「Unicode」でした。
guest

回答1

0

ベストアンサー

python

1file = open(files)

python

1file = open(files, encoding="utf8")

に変えて試してみて下さい。

投稿2017/07/06 00:13

mattn

総合スコア5030

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

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

monolith_91

2017/07/06 12:48

ありがとうございます!エラーに関しては無事解決しました。 (まだ正規表現のマッチが巧くいっていませんが)
monolith_91

2017/07/06 13:06

済みません。勘違いでした。最下部の「for files in file_lists:」のところで、下記エラーが発生します。 Traceback (most recant call last): File "<stdin>", line 4, in <module> File "F:\Anaconda3\Lib\codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError:'utf-8' codec can't decode byte 0xff in postion 0: invalid start byte
mattn

2017/07/06 14:44

0 の位置で 0xff という事は BOM ですね。utf-8 の代わりに utf-8-sig を使ってみて下さい。
monolith_91

2017/07/06 23:01

ありがとうございます。試してみましたが駄目でした。 エラー内容も全く同じでした。
mattn

2017/07/07 00:12

ファイルをどこかにアップ頂く事は可能ですか?
can110

2017/07/07 00:29

BOMが「FF FE」ならUTF-16LEの可能性がありますね。
monolith_91

2017/07/09 06:30

返信が遅くなりまして申し訳ありません。nkfを使ってtextのにエンコーディングをウutf-8に一括で変更してから、 open(files, encoding="utf8") で全て問題なくエラーが発生することなく開けるようになりました。 どうもありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問