Pythonでデータファイルを一挙に読み込む方法

Pythonでデータファイルを一挙に読み込む方法

データが格納されたファイル(.dat, .csvなど)を1行ずつ読み込む方法はわかるけど、一列全てのデータを一挙に読み込む方法はわからないって方いませんか?
この記事では、ファイルのある列の全データを一挙に読み込む方法を具体的に解説します。

動作環境
macOS Catalina(10.15.3), python3.7.6, Atomエディタ1.44.0

datファイルを一挙に読み込む

datファイルの準備

average_temperature_kyoto_2018.dat という2018年の京都市における各月の平均気温のデータが格納されたデータファイルを用意しました。

# averaged temperature in 2018 @ Kyoto city
# 01: month  02: averaged temperature in the daytime
1 3.9
2 4.4
3 10.9
4 16.4
5 20.0
6 23.4
7 29.8
8 29.5
9 23.6
10 18.7
11 13.5
12 8.2

Desktop/Dr.code/python/data-analysis/input_file_all というディレクトリにこのaverage_temperature_kyoto_2018.dat を保存しておきます。

コードを書こう

average_temperature_kyoto_2018.datと同じ階層にinput_file.py と名付けたファイルを保存します。
いきなり結論から入りますが、ファイルを読み込むためのコードは次のように書きます。各行を読み込む方法よりもシンプルに記述できますね。

import numpy as np

data_file = 'average_temperature_kyoto_2018.dat'
month = np.loadtxt(data_file, comments='#', usecols = 0)
ave_temperature = np.loadtxt(data_file, comments='#', usecols = 1)

print(month)
print(ave_temperature)

プログラムの実行をしよう

上記のプログラムを実行してみましょう。
ターミナルを開いて、cwdをDesktop/Dr.code/python/data-analysis/input_file_all にして、実行します。
(→やり方がわからない方はプログラムを実行する方法を参考にしてください。)

python input_file.py

# (実行結果)
# [ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12.]
# [ 3.9  4.4 10.9 16.4 20.  23.4 29.8 29.5 23.6 18.7 13.5  8.2]

うまくいけば上のように実行結果が表示されると思います。
なんの説明もなかったので、次はnp.loadtxt()がどういう機能をもつか説明します。

コードの解説

numpy.loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes', max_rows=None)

11個のパラメータから構成されているnumpyのload.txt関数です。使用する際には11個全てを記入する必要はなく、必要なものを選んで使えば問題ありません。 この関数は、データが格納されたファイル(fname)の指定した列(usecols)を読み込み、読み込んだデータが格納された配列を返します。 つまり、col1 = numpy.loadtxt(fname, usecols=0)と記述すると、fnameというファイルの1列目のデータが配列としてcol1に渡されます。 また、import numpy as npというようにas npを記述することで、np.loadtxt()という省略形で表記が可能になります。

numpy.loadtxtの各パラメータ(こちらを参考にまとめました)

パラメータ名概要
fname文字列読み込みたいファイルの名前やパスを記入します。
dtypeデータ型(省略可能)出力結果のデータ型を指定できます。
デフォルトではfloatです。
comments文字列(省略可能)コメント行の開始を示す文字を指定できます。
デフォルトで’#’です。上ではあえて書いていました。
delimiter文字列(省略可能)値を区切るために使われる文字列。
デフォルトでは (スペース)です。
converters辞書(dict)(省略可能)ある列の欠損を補完できる。
デフォルトはNone。
skiprowsInt(省略可能)コメント部を含む冒頭の何行を読み飛ばすかを指定できる。
デフォルトは0。
usecolsInt(省略可能)どの列を読み込むかを指定できる。
デフォルトでは、全ての列を読み込む。
例えばusecols=(1,4,5)とすると2,5,6列目を読み込む。
unpackBool型(省略可能)デフォルトではFalse。
Trueにすると、別々の列のデータを別々の変数に格納できる。
ndminInt(省略可能)返される配列の最低次元数。
デフォルトでは0。0,1,2が使える。
encoding文字列(省略可能)入力ファイルのデコードに使用されるエンコード。
デフォルトでは’bytes’。
max_rowsInt(省略可能)skiprowした後に、何行読み込むかを指定できる。
デフォルトでは全てを読み込む。
これを使えば、最後の数行を読み込まないようにできる。

ちょっと応用

パラメータを活用すれば、上で書いたコードよりも1行だけ省略した記述ができます。(こなれてる感が出せるぞ)

import numpy as np

data_file = 'average_temperature_kyoto_2018.dat'
month, ave_temperature = np.loadtxt(data_file, usecols = (0,1), unpack=True)

print(month)
print(ave_temperature)

csvファイルを一挙に読み込む

csvファイル

average_temperature_kyoto_2018.csv というファイルを用意しました。
上と同じく、Desktop/Dr.code/python/data-analysis/input_file_all に置きます。
中身は以下のようになっています。

# averaged temperature in 2018 @ Kyoto city
# 01: month  02: averaged temperature in the daytime
1,3.9
2,4.4
3,10.9
4,16.4
5,20.0
6,23.4
7,29.8
8,29.5
9,23.6
10,18.7
11,13.5
12,8.2

なお、Atomエディターでcsvを開く場合はtablrというプラグインをインストールしましょう。
pluginのinstall画面でtablrで検索すれば、インストールはすぐにできます。

サンプルコード

np.loadtxt(data_file, comments='#', usecols = 0)
np.loadtxt(data_file, comments='#', delimiter=',', usecols = 0) に書き換えればOKです!
全体のコードは次のようになります。
出力結果もdatファイルの時と同じになります。

import numpy as np

data_file = 'average_temperature_kyoto_2018.csv'
month = np.loadtxt(data_file, comments='#', delimiter=',', usecols = 0)
ave_temperature = np.loadtxt(data_file, comments='#', delimiter=',', usecols = 1)

print(month)
print(ave_temperature)