Pythonで構造化された文字列から必要なデータを抽出する方法を徹底解説
はじめに
本記事では、構造化された文字列(ログなど)から必要なデータやフィールドを抽出するための複数の方法を紹介します。これらのアプローチは、入力データのフォーマットがあらかじめ分かっている場合に特に有効です。
想定するデータ形式
まずは、アプローチを理解するためにサンプルのフォーマットを作成しましょう。
Report: <> - Time: <> - Player: <> - Titles: - Country: <>
実際のデータは以下のようなイメージです。
report = 'Report: Daily_Report - Time: 2020-10-10T12:30:59.000000 - Player: Federer - Titles: 20 - Country: Switzerland'
手順1:区切り文字を使った基本的な分割
このレポートを見て最初に気づくのは、各項目が「 - 」で区切られている点です。まずはこの区切り文字を基準にレポートをパースしてみましょう。
fields = report.split(' - ')
name, time, player, titles, _ = fields
print(f"Output \n *** The report name {name} generated on {time} has {titles} titles for {player}. ")出力結果
*** The report name Report: Daily_Report generated on Time: 2020-10-10T12:30:59.000000 has Titles: 20 titles for Player: Federer.
手順2:不要なラベルの除去
しかし、このままでは「Report:」「Time:」「Player:」といった不要なラベルが残っており、期待通りの出力とは言えません。そこで、各フィールドをさらに分割して値だけを取り出します。
# レポート名のみを抽出
formatted_name = name.split(':')[1]
# プレイヤー名のみを抽出
formatted_player = player.split(':')[1]
# タイトル数のみを抽出(整数に変換)
formatted_titles = int(titles.split(':')[1])
# 時刻のみを抽出
new_time = time.split(': ')[1]
print(f"Output \n {formatted_name} , {new_time}, {formatted_player} , {formatted_titles}")出力結果
Daily_Report , 2020-10-10T12:30:59.000000, Federer , 20
手順3:タイムスタンプの変換
タイムスタンプはISO形式になっているため、必要に応じてさらに分割できますし、そのまま扱っても問題ありません。ここでは、datetimeモジュールを使って日時オブジェクトに変換する方法を紹介します。
from datetime import datetime
formatted_date = datetime.fromisoformat(new_time)
print(f"Output \n{formatted_date}")出力結果
2020-10-10 12:30:59
手順4:一連の処理を関数にまとめる
ここまでの手順をすべて組み合わせて、再利用可能な単一の関数にまとめましょう。
def parse_function(log):
"""
Function : 指定された形式のログをパースする
Report: <> - Time: <> - Player: <> - Titles: - Country: <>
Args : log
Return : 必要なデータ
"""
fields = log.split(' - ')
name, time, player, titles, _ = fields
# レポート名のみを抽出
formatted_name = name.split(':')[1]
# プレイヤー名のみを抽出
formatted_player = player.split(':')[1]
# タイトル数のみを抽出
formatted_titles = int(titles.split(':')[1])
# 時刻のみを抽出
new_time = time.split(': ')[1]
return f"{formatted_name} , {new_time}, {formatted_player} , {formatted_titles}"
if __name__ == '__main__':
report = 'Report: Daily_Report - Time: 2020-10-10T12:30:59.000000 - Player: Federer - Titles: 20 - Country: Switzerland'
data = parse_function(report)
print(f"Output \n{data}")出力結果
Daily_Report , 2020-10-10T12:30:59.000000, Federer , 20
手順5:parseモジュールを使ったより簡単な方法
次に、parseモジュールを使えば、この処理をもっとシンプルに行えます。ログの形式からテンプレートを作成し、それを利用して抽出します。
まず、以下のコマンドでparseモジュールをインストールしてください。
pip install parse
from parse import parse
report = 'Report: Daily_Report - Time: 2020-10-10T12:30:59.000000 - Player: Federer - Titles: 20 - Country: Switzerland'
# ログの形式をもとにテンプレートを作成
template = 'Report: {name} - Time: {time} - Player: {player} - Titles: {titles} - Country: {country}'
# parseを実行して結果を確認
data = parse(template, report)
print(f"Output \n{data}")出力結果
<Result () {'name': 'Daily_Report', 'time': '2020-10-10T12:30:59.000000', 'player': 'Federer', 'titles': '20', 'country': 'Switzerland'}>わずか1行のコードで、テンプレートを定義するだけでログからデータを抽出できました。続いて、個々の値を取り出してみましょう。
print(f"Output \n {data['name']} - {data['time']} - {data['player']} - {data['titles']} - {data['country']}")出力結果
Daily_Report - 2020-10-10T12:30:59.000000 - Federer - 20 - Switzerland
まとめ
本記事では、ログファイルから必要なデータをパースして抽出する複数の方法を紹介しました。手動でsplit()を使って分解する方法と、parseモジュールでテンプレートを定義して抽出する方法の2つがあります。実務では、テンプレートを定義してparseモジュールを活用する方が、コードが簡潔になり保守性も向上するためおすすめです。
-
Pythonでウィキペディアのデータを抽出する方法を徹底解説
この記事では、Pythonを使ってウィキペディアのデータを抽出する方法を詳しく解説します。PythonはWebスクレイピングの分野で広く活用されており、Webサイトからメタ情報を収集するツールの開発に非常に適した言語です。 本記事では、Wikipedia APIとwikipediaライブラリを使用して、ウィキペディアのソースURLからデータを取得します。APIを利用することで、指定したURLから簡単にデータをフェッチでき、その後、対象のURLに対してメソッドを呼び出して、取得した情報を画面に出力することができます。 事前準備:wikipediaライブラリのインストール ウィキペディアからデータ
-
WebサイトからExcelへデータを自動抽出する方法|「Webから」機能の使い方を徹底解説
WebページからExcelワークシートへのデータの自動抽出(収集・更新)は、業務内容によっては欠かせない作業です。実はExcelには、Webページから直接データを取得できる機能が標準搭載されており、データ分析業務でExcelを活用する方にとって最も利用頻度の高い機能の一つとなっています。例えば金融アナリストであれば、分析のために毎日の株価をWebサイトからExcelブックへ取り込みたい場面があるでしょう。本記事では、WebサイトからExcelへデータを自動抽出する方法を、初心者にもわかる手順で丁寧に解説します。WebサイトからExcelへデータを自動抽出する基本手順ここでは、Excelの「デー