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

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

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

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

Python

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

Q&A

解決済

1回答

603閲覧

Python ディレクトリ内のテキストファイルに対して一括で処理をしたいです

nuii_

総合スコア15

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/09/20 14:16

前提・実現したいこと

Pythonで青空文庫から取得したデータを処理し、台詞のみを抜きだして別ファイルとして保存したいです。
ディレクトリ内にダウンロードした小説のテキストデータをまとめているので、それらに対し処理を行いたいと考えています。
ディレクトリ内の1ファイルを指定して実行すると処理できるのですが、下のソースコードで実行するとエラーを吐いてしまいます。

発生している問題・エラーメッセージ

IndexError Traceback (most recent call last) <ipython-input-20-d219f77dfcf1> in <module>() 24 #text = text.replace('テキスト','text') 25 # ヘッダ部分の除去 ---> 26 text = re.split('\-{5,}',text)[2] 27 # フッタ部分の除去 28 text = re.split('底本:',text)[0] IndexError: list index out of range

該当のソースコード

Python

1import os 2import codecs 3import re 4 5data_dir_path = u"./aozorabunko_sinjisinkana" 6file_list = os.listdir(r'./aozorabunko_sinjisinkana') 7 8for file_name in file_list: 9 root, ext = os.path.splitext(file_name) 10 if ext == u'.txt': 11 abs_name = data_dir_path + '/' + file_name 12 f = codecs.open(abs_name, "r", "shift_jisx0213") 13 text = f.read() 14 f.close() 15 16# ヘッダ部分の除去 17text = re.split('\-{5,}',text)[2] 18# フッタ部分の除去 19text = re.split('底本:',text)[0] 20# | の除去 21text = text.replace('|', '') 22# ルビの削除 23text = re.sub('《.+?》', '', text) 24# 入力注の削除 25text = re.sub('[#.+?]', '',text) 26# 全角スペースの除去 27text = re.sub(r'\u3000', '', text) 28# |(全角)の除去 29text = text.replace('|', '') 30# 台詞の連続をTabに変換 31text = re.sub('」\r\n「', '\t', text) 32# 空行の削除 33text = re.sub('\n\n', '\n', text) 34text = re.sub('\r', '', text) 35#「」で囲まれた文のみ抽出 36text = re.findall('「.*?」', text) 37 38# リストを展開・改行区切りで出力(ディレクトリ内一括処理) 39list = text 40s = '\n'.join(list) 41f_out = codecs.open(abs_name + 'out.txt', "w", "shift_jisx0213") 42print(s, file=f_out) 43f_out.close() 44

環境

Python 3.6.6
Anaconda 4.5.11
Windows 8.1
Jupyter notebook 5.6.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、現在行っている処理は各テキストに対する処理にはなっていません。ループの外で処理をしているため、最後にループされたテキストに対してのみ処理が動いています。

まずはabs_nameを受け取り、一通り処理を行うような関数を作るのが良いかと思います。その関数をループの中で呼び出して使えば要求を満たせますし、コードも見やすくなります。

ヘッダの処理に失敗しているようですが、ヘッダのフォーマットがファイルによって異なるため、そのコードでは意図通り処理できないファイルがあるのではないでしょうか?

検討して対策を練る必要がありそうです。

投稿2018/09/20 15:11

編集2018/09/20 17:40
hayataka2049

総合スコア30933

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

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

nuii_

2018/09/20 17:34

2点について見直し、正しく処理がなされるように書き直すことができました。 回答ありがとうございました。
hayataka2049

2018/09/20 17:38

解決したようで何よりです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問