ゼロからの業務効率化ノート

30代未経験から始まったノーコード&Pythonチャレンジ

【読み込みからデータ抽出】Pythonでテキストファイルを操る初心者向けガイド


ぬこ将軍です🐈
旅行に行っていたので更新がいつも以上に滞りましたm(_ _)m

プログラミング言語Pythonを使うようになってから、部署内でもそれが知られているのでPythonに関する相談がたまに来るようになりました。
みんな困りごとが多種多様なのですぐに解決できないものもありますが、自分自身の更なるスキルアップのきっかけになるので嬉しい面もあります。


今回は「Pythonでのテキストファイルの取り扱い」について書こうかと思います。
自分はメーカーの研究開発部署で働いているのですが、「テキストファイルで出力される実験結果からデータとして整理したい部分を抽出する」という作業が自分も同部署の人も結構あります。
同様な職種の方もそうでない方も、似たような作業はよくあるのではないでしょうか?そしてその作業、面倒ではありませんか?

  • プログラミング言語Pythonを始めたばかりで、どんどん知識を吸収したい!
  • Pythonでテキストファイルからのデータ抽出を簡単に出来るようにしたい!

そんな方々の参考になりましたら幸いです。面倒な作業も、pythonなら効率化できる可能性があります!


Pythonでテキストファイルから必要箇所を抽出&データ化する方法

今回の例として、以下画像のテキストファイルを用いようと思います。

特徴としては以下の通りです。テキストファイル出力だと結構ありがちな特徴ではないでしょうか?

  • 1,2行目にデータに関する説明や日付が書かれている。
  • 空白の行がある(この例だと3行目)。
  • 4行目にデータの列名が書かれている。
  • 5~7行目に値が書かれている。
  • 4~7行目をデータ化の必要箇所として抽出したい

このような特徴をもつテキストファイルからどのようにデータを抽出するのか、次から説明していきます。

Pythonでテキストファイルの中身を読み込む

読み込むためにはまずpathという変数にテキストファイルのパスを代入し、PythonのOpen関数を使って【with open(path, encoding = "utf_8") as f:】と書きます。

これは【with open("パス文字列"またはパス文字列を代入した変数, encoding = "エンコード文字列") as ファイルオブジェクト名:】と書くことで、「指定したファイルオブジェクト名で、指定したパスのファイルを、指定したエンコード形式で読みこむ」となります。

Open関数ではwith open()と書くことがだいたいで、こうすることでopen()の後にclose()と必ず書かないといけないルールを気にする必要がなくなります
そしてファイルオブジェクト名も、だいたいはfを指定することが多いです。

またエンコードの形式はutf_8の他にcp932, euc_jp, shift_jisなどがあります。

参考サイト
note.nkmk.me

そしてファイルの中身全体を文字列で確認したい時は【read()】のメソッドを使って【f.read()】(つまりファイルオブジェクト名.read())と書きます。
出力することで、テキストファイルの中身がPythonでも確認できました。

Pythonでテキストファイルの必要箇所を抽出

テキストファイルから必要箇所を抽出するまでが結構面倒に感じたので、この過程は長くなりますm(_ _)m
必要箇所の抽出前に、まずは中身を行ごとにリスト型で表示してみます。

【readlines()】のメソッドを使って【f.readlines()】(つまりファイルオブジェクト名.readline())と書くことで、テキストファイル全体の中身を行ごとにリストで取得できます
今回の場合だと【['データのタイトルとか日付\n', 'データの測定条件\n', '\n', 'データ列A\tデータ列B\tデータ列C\tデータ列D\n', 'aaa\t123\t456\t〇\n', 'bbb\t000\t000\t×\n', 'ccc\t135\t246\t〇']】という風に取得されます。

リストの要素内に\nや\tとありますがこれはエスケープシーケンスというもので、プログラム上で特殊な手段を実行するために使われています。例えば\nは改行の役割があり、\tはタブスペースの役割を持っています。

エスケープシーケンスは\nまたは¥nで書かれることが多いですが、どちらも同じです。

エスケープシーケンスに関するブログ記事

Python初心者必読!フォルダとファイルのパス指定の落とし穴と解決法 - ゼロからの業務効率化ノート

【意外と知らない!?】Python初心者必見!驚くべきprint関数の小技5選 - ゼロからの業務効率化ノート

また実際にデータとして抽出する場合は各行にある要素(データ列Aとかデータ列Bとか)を分割しておきたいので、このままでは使えそうにありません。

なのでテキストファイル内の必要な部分だけ抽出するために別のコードで処理します。

【readlines()】を使ってますが、今度は【 [l.split() for l in f.readlines()]】と書いています。
これは「ファイル内の各行の要素をlとして、split()メソッドで空白文字(スペースや改行\n、タブ\tなど)を分割する」ということをしています。
こうすることで【[['データのタイトルとか日付'], ['データの測定条件'], [], ['データ列A', 'データ列B', 'データ列C', 'データ列D'], ['aaa', '123', '456', '〇'], ['bbb', '000', '000', '×'], ['ccc', '135', '246', '〇']]】という風に取得され、空白文字が削除されて各行内の要素も分割されている状態に出来ます

ちなみに[l.split() for l in f.readlines()]という書き方はリスト内包表記と呼ばれています。

リスト内包表記に関する参考サイト

note.nkmk.me

そして冒頭で書いた通り、必要箇所はデータ列と値が書かれた行です。確認ために出力してみます(Pythonでは番号の始まりは0)。

このように、リスト内でインデックス番号で指定することで抽出できるようになりました。

テキストファイルの抽出部分から表形式データを作る

必要な部分を抽出できれば後はデータの形にするだけです。今回は2次元の表形式データ(データフレーム)を作ってみます。
データフレームを作るには新しくpandasというライブラリを使うので、【import pandas as pd】でpandasを使える状態にします。そもそもpandasがインストールされていない場合は先にインストールしておきましょう。

コードは以下の画像の通りです。

これはpandasで2次元データを作成する時の基本構造なのですが、【pd.DataFrame(格納したいデータ配列, index = 行名, columns = 列名)】という書き方が一般的です。

今回の場合は以下画像のように列名がテキストファイルの3行目、格納したいデータ配列がテキストファイルの4~7行目です。
ちなみに行名と列名は指定必須ではありません。

なので【pd.DataFrame(s[4:7],columns=[s[3]])】という記載になります。

データフレームの特定列のデータ型を変換する

テキストファイルから必要な箇所だけ抽出してデータ化できたのでここで終わりでも良いのですが、今回のデータの場合「データ列B」と「データ列C」の値が数字になっています。
試しに各列の値のデータ型を確認してみます。

【df.dtypes】で各列の値のデータ型を確認できます。ちなみにpandasで作成したデータフレームの各列のデータ型のことをdtypeと言います。

各列のdtypeを確認してみると全てobjectになっています。objectというのはdtype特有のデータ型ですが、Pythonのstr型(文字列)と等価です。
基本的に、数字はstr型ではなくint型(数値)でないと様々なデータ処理はやりにくいです。なので今回の場合、「データ列B」と「データ列C」の値はint型に変換しましょう。

変換のコードは以下画像の通りです。

データフレームでは特定の列を指定したい場合は【 df["指定したい列名"]】のように書きます。そして特定の列のデータ型を変換する際は【 df["指定したい列名"].astype(変換後の型)】と書きます。
今回の場合はint型に変換したいので【 df["データ列B"].astype(int)】となります。データ列Cについても同様の処理をします。
そして【(df["データ列B"].applymap(type)】で列の各値のデータ型を確認してみると、ちゃんと型変換できていることが確認できます。

こういった感じで、テキストファイルから必要な箇所を抽出し、適切にデータ型を変換できたデータフレームが完成しました!

Pythonでテキストファイルを操る方法まとめ

今回のことをまとめると以下の通りです。

  1. Pythonでテキストファイルの中身を読み込む
  2. Pythonでテキストファイルの必要箇所を抽出
  3. テキストファイルの抽出部分からデータフレームを作る
  4. データフレームの特定列のデータ型を変換する

テキストファイルとして出力されるものから必要な箇所だけ抽出してデータ整理に利用したい、というのは結構ありがちなシチュエーションですが、Pythonを活用することで実現可能です!
説明を加えながらなので文章にすると長くなってしまいますが、実際にやってみると簡単です。

実は今回紹介した方法とは別の方法もあるのですが、それは下記の記事で紹介しています!

【読み込みすぐデータ化】Pythonでテキストファイルを操る初心者向けガイド2 - ゼロからの業務効率化ノート

プログラミング未経験の方にこそPythonの勉強はオススメです!その理由を自分なりに考えてみました。

【Python歴約1年が考える】プログラミング未経験者におすすめの理由 ─ Pythonの魅力とは? - ゼロからの業務効率化ノート