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 sys
でsys
モジュールをインポートしてます。
これはエラー処理で使います。
import sys
それからnums
というリストを作っておきます。
このリストに変換した整数が保存されます。
nums = []
with
文とopen()
を使ってファイルを開きます。
ファイル名はdata.txt
で、モードはr
, それからencoding
はutf-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 sys
でsys
モジュールをインポートします。
これはエラー処理で使います。
import sys
mat
というリストを作っておきます。
このリストに結果が保存されていきます。
mat = [] # 結果を入れるリスト(行列)
with
文とopen()
を使ってファイルを開きます。
繰り返しになりますがファイル名はdata.txt
で、モードはr
, それからencoding
はutf-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()
は引数の文字列に従って文字列を分割するメソッドです。結果は新しい文字列として返ってきます。
この結果のtoks
をfor
文で回します。
toks = line.split(' ') # 行を半角スペースで分割する
for tok in toks: # 分割したトークン列を回す
...
for
文で取り出したトークンをint()
に渡して整数に変換します。
このときエラー(ValueError
)が発生したら画面にエラー内容を出力して、ループをスキップします。
整数への変換に成功したらnum
をrow
に保存します。
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) # 結果を出力
↑のコードの詳しい解説は先ほどの半角スペースの解説をご覧ください。
おわりに
今回はテキストファイルに書かれている数値データの解析方法を見てみました。
テキストファイルにデータを保存するというのは非常によくあることなので、この記事が皆さんの一助になれば幸いです。
🦝 < 解析してあげる
🐭 < 変換してあげる