###前提・実現したいこと
私は、ニュース記事が格納されている特定のフォルダ配下の全てのテキストファイルを読み込んで、
正規表現で、とある表現と一致した箇所だけ抜き出すためのコードを書いております。
###発生している問題・エラーメッセージ
その際、コードを実行すると下記のエラーが発生します。
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-----------------------------------------------------
同様のフォーマットが続いていく…。
回答1件
あなたの回答
tips
プレビュー