Python 実践 データ加工/可視化 100本ノック に挑戦 ノック53

ノック53:本文以外の項目を取り出そう

タイトルと著者を抜き出します。

readline()を使って1行づつ読んでいきます。

テキストの1行目に走れメロスというタイトルが記入されているので、

1行目をtitleという変数に代入します。

2行目に太宰治と著者名が記入されているので、authorという変数を用意し代入します。

with open('data/hashire_merosu.txt',mode='r',encoding='shift-jis') as f :
    title = f.readline()
    author = f.readline()

print(title)
print(author)

 

実行結果

走れメロス

太宰治

 

間に改行コードがあるので、削除して再度実行します。

\nは改行コードを表しています。

title  = title.replace('\n','')
author = author.replace('\n','')
print(title)
print(author)

 

実行結果

走れメロス
太宰治

 

次に公開日と修正日を取得します。

テキストのデータを1行単位で全てリードするreadlines()を使用して、

DataFrameの型にします。

with open('data/hashire_merosu.txt',mode='r',encoding='shift-jis') as f :
    content = f.readlines()

import pandas as pd

df = pd.DataFrame(content,columns=['text'])
print(df.head())

 

実行結果

                                               text
0                                            走れメロス\n
1                                              太宰治\n
2                                                 \n
3  ----------------------------------------------...
4                                【テキスト中に現れる記号について】\n

 

改行コードが入るので、replaceで削除します。

str.xxxのように文字列を呼び出して処理します。

df['text'] = df['text'].str.replace('\n','')
print(df.head())

 

実行結果

                                                text
0                                              走れメロス
1                                                太宰治
2
3  ----------------------------------------------...
4                                  【テキスト中に現れる記号について】

 

データフレーム型のデータから公開日と修正日を取得します。

str.containsは部分一致でその文字列が含まれている箇所を抽出します。

date = df[(df['text'].str.contains('日公開'))|(df['text'].str.contains('日修正'))].copy
print(date)

 

実行結果

101  2000年12月4日公開
102  2011年1月17日修正

 

101行目、102行目にヒットしました。

体裁を整えて2000/12/4 と2011/1/17に変更します。

date['text'] = date['text'].str.replace('公開','')
date['text'] = date['text'].str.replace('修正','')
date['text'] = date['text'].str.replace('年','/')
date['text'] = date['text'].str.replace('月','/')
date['text'] = date['text'].str.replace('日','')
print(date)

 

実行結果

101  2000/12/4
102  2011/1/17

 

datetimeで変換した場合は以下のようになります。

date['text'] = pd.to_datetime(date['text'])
print(date)

 

実行結果

101 2000-12-04
102 2011-01-17

 

最後に取得したデータをデータフレーム型で保存します。

 

変数bodyについては、ノック52のデータを使用します。

with open('data/hashire_merosu.txt',mode='r',encoding='shift-jis') as f :
    content = f.read()

content = ' '.join(content.split())
import unicodedata
content = unicodedata.normalize('NFKC',content)

import re
pattern = re.compile(r'^.+(#地から1字上げ].+#地から1字上げ]).+$')

body = re.match(pattern,content).group(1)

body=body.replace('#地から1字上げ] ------------------------------------------------------- ','')
body=body.replace(' [#地から1字上げ]','')

 

release_date = date.iat[0,0] #左側が行、右側が列 0行0列
update_date  = date.iat[1,0] #1行0列

booklist = pd.DataFrame([[title,author,release_date,update_date,body]],
            columns=['title','autor','release_date','update_date','body'])
print(booklist)

 

実行結果

 title autor release_date update_date                                               body
0  走れメロス   太宰治   2000-12-04  2011-01-17  メロスは激怒した。必ず、かの邪智暴虐《じゃちぼうぎゃく》の王を除かなければならぬと決意した 
。...

 

 

 

 

 

/* -----codeの行番号----- */