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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python

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

Q&A

解決済

1回答

1669閲覧

テキストファイル内容の余分な部分を取り除きたい

退会済みユーザー

退会済みユーザー

総合スコア0

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python

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

0グッド

0クリップ

投稿2020/08/14 06:44

前提

夏目漱石「三四郎」が書かれたテキストファイル("sanshiro.txt")の内容から、余分な部分を取り除いて表示したいと思います。
参考したネット情報ではzipファイルを解凍させ、即座にテキストファイルを読み込んでいます。
同じように実施すると修正時に何回もファイルの解凍をおこなうことになるので、
解凍部分を分離させてテキストファイルの読み込みが行えるようにしました。

ですが、下記のように元のコードでは余分な部分が取り除けましたが、
変更したコードではできなくなりました。
何か有効な手法はございますでしょうか?

ご教授の程、お願いいたします。

該当コード

変更後

txtf = open("sanshiro.txt") contents = txtf.read() print(type(contents)) # => <class 'str'> print(contents) # ファイル整形 import re # ヘッダ部分の除去 txtf = re.split('\-{5,}',contents)[2] # フッタ部分の除去 txtf = re.split('底本:',contents)[0] # | の除去 txtf = contents.replace('|', '') # ルビの削除 txtf = re.sub('《.+?》', '', contents) # 入力注の削除 txtf = re.sub('[#.+?]', '',contents) # 空行の削除 txtf = re.sub('\n\n', '\n',contents) txtf = re.sub('\r', '',contents) # 整形結果確認 # 頭の100文字の表示 print(contents[:100]) # 見やすくするため、空行 print() print() # 後ろの100文字の表示 print(contents[-100:])

三四郎
夏目漱石


【テキスト中に現れる記号について】

《》:ルビ
(例)頓狂《とんき

青空文庫作成ファイル:
このファイルは、インターネットの図書館、青空文庫(http://www.aozora.gr.jp/)で作られました。入力、校正、制作にあたったのは、ボランティアの皆さんです。

元のコード

url = 'https://www.aozora.gr.jp/cards/000148/files/794_ruby_4237.zip' zip = '794_ruby_4237.zip' import urllib.request #URL によってリソースを取得し、それを一時的な場所に保存 urllib.request.urlretrieve(url, zip) # ダウンロードしたzipの解凍 import zipfile with zipfile.ZipFile(zip, 'r') as myzip: myzip.extractall() # 解凍後のファイルからデータ読み込み for myfile in myzip.infolist(): # 解凍後ファイル名取得 filename = myfile.filename # ファイルオープン時にencodingを指定してsjisの変換をする with open(filename, encoding='sjis') as file: text = file.read() # ファイル整形 import re # ヘッダ部分の除去 text = re.split('\-{5,}',text)[2] # フッタ部分の除去 text = re.split('底本:',text)[0] # | の除去 text = text.replace('|', '') # ルビの削除 text = re.sub('《.+?》', '', text) # 入力注の削除 text = re.sub('[#.+?]', '',text) # 空行の削除 text = re.sub('\n\n', '\n', text) text = re.sub('\r', '', text) # 整形結果確認 # 頭の100文字の表示 print(text[:100]) # 見やすくするため、空行 print() print() # 後ろの100文字の表示 print(text[-100:])


うとうととして目がさめると女はいつのまにか、隣のじいさんと話を始めている。このじいさんはたしかに前の前の駅から乗ったいなか者である。発車まぎわに頓狂な声を出して駆け込んで来て、いきなり肌をぬい

評に取りかかる。与次郎だけが三四郎のそばへ来た。
「どうだ森の女は」
「森の女という題が悪い」
「じゃ、なんとすればよいんだ」
三四郎はなんとも答えなかった。ただ口の中で迷羊、迷羊と繰り返した。

やってみたこと

変更後は、元のコードから入手したテキストファイル("sanshiro.txt")の読み込みから始めました。
元と変更後の両者とも、頭と後ろの100文字のみ出力するようにしています。
頭と後ろの100文字は2行空けて表示しています。
元コードは余分な部分を取り除いた上で結果を表示させています。

補足事項

windows10
python3.7.4
参考:https://qiita.com/makaishi2/items/63b7986f6da93dc55edd

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

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

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

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

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

1T2R3M4

2020/08/14 07:02

txtfをfile、contentsをtextにして元のコードと確認してみては。
guest

回答1

0

ベストアンサー

元のソースだと読み込んだtext変数を上書きしながら処理していますが、
変更後ソースだとcontents変数には上書きせずtxtf変数に書き出しています。
ただこれだとそれぞれの処理の変更が残らないし、そもそも書き出したtxtf変数を出力に使っていません。
ただそれだけのことでは?

contents変数を上書き処理して試した分には元ソースと同じ結果になっていると思います。

python

1txtf = open("sanshiro.txt") 2contents = txtf.read() 3print(type(contents)) 4# => <class 'str'> 5print(contents) 6 7# ファイル整形 8import re 9# ヘッダ部分の除去 10contents = re.split('\-{5,}',contents)[2] 11# フッタ部分の除去 12contents = re.split('底本:',contents)[0] 13# | の除去 14contents = contents.replace('|', '') 15# ルビの削除 16contents = re.sub('《.+?》', '', contents) 17# 入力注の削除 18contents = re.sub('[#.+?]', '',contents) 19# 空行の削除 20contents = re.sub('\n\n', '\n',contents) 21contents = re.sub('\r', '',contents) 22 23# 整形結果確認 24 25# 頭の100文字の表示 26print(contents[:100]) 27# 見やすくするため、空行 28print() 29print() 30# 後ろの100文字の表示 31print(contents[-100:])

投稿2020/08/14 07:35

yureighost

総合スコア2183

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

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

退会済みユーザー

退会済みユーザー

2020/08/14 09:06

ご回答ありがとうございます。 ファイル名だけを示すtxtfをそのファイル内容を示すcontentsと同等に扱っていたのが原因だったようです。教えていただいたコードで問題なく出力できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問