ユーニックス総合研究所

  • home
  • archives
  • python-read-number-in-text-file

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

  • 作成日: 2021-04-23
  • 更新日: 2023-12-24
  • カテゴリ: Python

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

Pythonでテキストファイルに数値データを保存しておくというのはよくある話だと思います。
業務やソフトウェアのデータをテキストファイルに保存し、それをあとからPythonを使って読み込むという感じです。

今回はテキストファイルに書かれている数値データをPythonで読み込む方法をまとめてみました。
具体的には↓を見ていきます。

  • 1行に1データを読み込む
  • 1行に複数データを読み込む

1行に1データを読み込む

1行に1データが書かれているフォーマットのテキストファイルを読み込む方法です。

整数のデータを読み込む

1行に1つの整数データが書かれているフォーマットのテキストファイルを読み込む方法です。
どういうテキストファイルかと言うと、↓のようなテキストファイルです。

1  
2  
3  
4  

↑のようなテキストファイル(data.txt)の行を解析して、その行をPythonの整数(int)に変換してリストに保存するには↓のようなコードを書きます。

import sys  

nums = []  # 整数を入れるリスト  

with open('data.txt', 'r', encoding='utf-8') as fin:  # ファイルを開く  
    for line in fin.readlines():  # 行を読み込んでfor文で回す  
        try:  
            num = int(line)  # 行を整数(int)に変換する  
        except ValueError as e:  
            print(e, file=sys.stderr)  # エラーが出たら画面に出力  
            continue  

        nums.append(num)  # 変換した整数をリストに保存する  

print(nums)  # リストの中身を出力  

↑のコードを実行すると↓のような結果になります。

[1, 2, 3, 4]  

まず冒頭でimport syssysモジュールをインポートしてます。
これはエラー処理で使います。

import sys  

それからnumsというリストを作っておきます。
このリストに変換した整数が保存されます。

nums = []  

with文とopen()を使ってファイルを開きます。
ファイル名はdata.txtで、モードはr, それからencodingutf-8にしています。
モードrはテキストファイルを読み込みモードで開くモードです。
Windows環境ではencoding='utf-8'を付けておかないとUTF-8のファイルを開くときにエラーになります。
開いたファイルオブジェクトはfinという名前にしておきます。

with open('data.txt', 'r', encoding='utf-8') as fin:  # ファイルを開く  
    ...  

ファイルオブジェクトのreadlines()メソッドでファイル内の行をすべて読み込みます。
readlines()は結果をリストで返してくるので、これをfor文で回して1行ずつ取り出します。

    for line in fin.readlines():  # 行を読み込んでfor文で回す  
        ...  

int()を使って行を整数に変換します。
int()は変換できないデータが渡されると、ValueErrorを送出します。
そのためこれをキャッチするようにしておいて、画面にエラーを出力後、ループをスキップするようにします。
エラーの出力先はsys.stderrにしておきます。これは標準エラー出力です。
このエラー処理は開発者によって変わると思います。開発者によってはエラーをスキップせずに例外を再送出するかもしれません。

        try:  
            num = int(line)  # 行を整数(int)に変換する  
        except ValueError as e:  
            print(e, file=sys.stderr)  # エラーが出たら画面に出力  
            continue  

行を整数に変換したら、その結果をnumsに保存します。

        nums.append(num)  # 変換した整数をリストに保存する  

最後にnumsを出力して完了です。

print(nums)  # リストの中身を出力  

浮動小数点数のデータを読み込む

浮動小数点数で書かれたデータを1行ずつ読み込む場合です。
たとえば↓のようなテキストファイルです。

1.23  
2.34  
3.45  
4.56  

これも基本的には行の変換でint()float()に変える以外は整数の場合と同じです。
具体的な解説は↑の整数の解説をご覧ください。

import sys  

nums = []  # 実数を入れるリスト  

with open('data.txt', 'r', encoding='utf-8') as fin:  # ファイルを開く  
    for line in fin.readlines():  # 行を読み込んでfor文で回す  
        try:  
            num = float(line)  # 行を実数(float)に変換する  
        except ValueError as e:  
            print(e, file=sys.stderr)  # エラーが出たら画面に出力  
            continue  

        nums.append(num)  # 変換した実数をリストに保存する  

print(nums)  # リストの中身を出力  

1行に複数データを読み込む

1行に複数のデータがある場合の解析方法です。
行のフォーマットはCSVのようなフォーマットが想定されます。
ここではスペース区切りの場合とカンマ区切りの場合のテキストファイルの読み込み方法を解説します。

スペース区切りのデータを読み込む

スペース区切りで書かれた数値データとは、例えば↓のようなテキストファイルのことです。

1 2 3  
4 5 6  
7 8 9  
10 11 12  

↑のようなテキストファイル(data.txt)を1行ずつ解析して、その行のデータを整数に変換する場合です。

↓のようなコードが考えられます。

import sys  

mat = []  # 結果を入れるリスト(行列)  

with open('data.txt', 'r', encoding='utf-8') as fin:  # ファイルを開く  
    for line in fin.readlines():  # 行をすべて読み込んで1行ずつfor文で回す  
        row = []  # 行のデータを保存するリスト  
        toks = line.split(' ')  # 行を半角スペースで分割する  
        for tok in toks:  # 分割したトークン列を回す  
            try:  
                num = int(tok)  # 整数に変換  
            except ValueError:  
                print(e, file=sys.stderr)  # エラーが出たら画面に出力して  
                continue  # スキップ  

            row.append(num)  # 行に保存  

        mat.append(row)  # 行をnumsに保存  

print(mat)  # 結果を出力  

↑のコードを実行すると↓のような結果になります

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]  

まずimport syssysモジュールをインポートします。
これはエラー処理で使います。

import sys  

matというリストを作っておきます。
このリストに結果が保存されていきます。

mat = []  # 結果を入れるリスト(行列)  

with文とopen()を使ってファイルを開きます。
繰り返しになりますがファイル名はdata.txtで、モードはr, それからencodingutf-8にしています。
モードrはテキストファイルを読み込みモードで開くモードです。
Windows環境ではencoding='utf-8'を付けておかないとUTF-8のファイルを開くときにエラーになります。
開いたファイルオブジェクトはfinという名前にしておきます。

with open('data.txt', 'r', encoding='utf-8') as fin:  # ファイルを開く  
    ...  

readlines()で行全体を読み込みます。
readlines()は結果をリストで返してくるので、それをfor文で回すことで1行ずつ取り出します。

    for line in fin.readlines():  # 行をすべて読み込んで1行ずつfor文で回す  
        ...  

行のデータを保存するリストrowを作っておきます。
このrowは最終的にmatに保存されます。

        row = []  # 行のデータを保存するリスト  

行をsplit()で分割してtoksに保存します。
split()は引数の文字列に従って文字列を分割するメソッドです。結果は新しい文字列として返ってきます。
この結果のtoksfor文で回します。

        toks = line.split(' ')  # 行を半角スペースで分割する  
        for tok in toks:  # 分割したトークン列を回す  
            ...  

for文で取り出したトークンをint()に渡して整数に変換します。
このときエラー(ValueError)が発生したら画面にエラー内容を出力して、ループをスキップします。
整数への変換に成功したらnumrowに保存します。

            try:  
                num = int(tok)  # 整数に変換  
            except ValueError:  
                print(e, file=sys.stderr)  # エラーが出たら画面に出力して  
                continue  # スキップ  

            row.append(num)  # 行に保存  

forループが終わったらrowが出来上がっているので、これをmatに保存します。
エラーが発生している場合はrowにデータ抜けがある場合があります。
これが嫌な場合はエラー処理を変更する必要があります。

        mat.append(row)  # 行をnumsに保存  

最後にmatを出力します。

print(mat)  # 結果を出力  

カンマ区切りのデータを読み込む

カンマ区切りの行を分割する場合は先ほどのスペース区切りを解析するコードの、split()の引数をカンマにすれば対応可能です。
例えば↓のようなテキストファイルですが、

1,2,3  
4,5,6  
7,8,9  
10,11,12  

このテキストファイルを解析するコードは↓のようになります。

import sys  

mat = []  # 結果を入れるリスト(行列)  

with open('data.txt', 'r', encoding='utf-8') as fin:  # ファイルを開く  
    for line in fin.readlines():  # 行をすべて読み込んで1行ずつfor文で回す  
        row = []  # 行のデータを保存するリスト  
        toks = line.split(',')  # 行をカンマで分割する  
        for tok in toks:  # 分割したトークン列を回す  
            try:  
                num = int(tok)  # 整数に変換  
            except ValueError:  
                print(e, file=sys.stderr)  # エラーが出たら画面に出力して  
                continue  # スキップ  

            row.append(num)  # 行に保存  

        mat.append(row)  # 行をnumsに保存  

print(mat)  # 結果を出力  

↑のコードの詳しい解説は先ほどの半角スペースの解説をご覧ください。

おわりに

今回はテキストファイルに書かれている数値データの解析方法を見てみました。
テキストファイルにデータを保存するというのは非常によくあることなので、この記事が皆さんの一助になれば幸いです。

🦝 < 解析してあげる

🐭 < 変換してあげる