機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

【python】【初心者】tkinterを使ってcsvファイルを読み取る方法(1/3)

pythonTkinterCSVを読み取る方法 part1

■はじめに

以前、新しいExcelファイルを作成し、そのファイルの中にpythonの計算結果を自動で代入する方法を紹介しました。
stjun.hatenablog.com

 pythonで計算する場合は上記でも良いですが、特に技術者や理系の学生などはCSVファイルの実験データを扱うことが多く、CSVの中身はpythonに取り込みたいというニーズもあるかと思います。

そこでtkinterを使って任意のCSVファイルを指定し②その指定したCSVファイルから欲しい情報を抜き出し③抜き出した情報をpython上で計算してExcelシートに代入し、Excelファイルを作成する方法を紹介します。

上記はこれまでと比べて少し複雑なコードになるため3記事に分けたいと思います。

本記事ではまず②のCSVファイルから欲しい情報を抜き出す方法を紹介します。

 

■コード

忙しい方やpythonのコードを自力で読んで理解できる方向けに、先にコードを載せます。動作環境はAnaconda(python3.7)です。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

#skiprows=2を入れれば先頭の2行飛ばして3行目から読み始める
#data01.csvはjupyter noteboookが入っているフォルダと同じフォルダに置いておく
data_1, data_2,data_3= np.loadtxt("./data01.csv", skiprows=2, unpack=True) #以下はちゃんとcsvの数値を読み取れているかの確認 print(data_1) print(data_2) print(data_3) #以下はグラフを表示する設定(おまけ) fig = plt.figure(figsize=(18,12)) ax1=plt.subplot2grid((1,2),(0,0)) ax2=plt.subplot2grid((1,2),(0,1)) ax1.plot(data_1,data_2,"o-",color="r",label="test1") ax1.set_xlim(0,5) ax1.set_ylim(0,20) ax1.set_xlabel("[s]") ax1.set_ylabel("[h]") ax1.legend(loc="upper right") ax2.plot(data_1,data_3,"o-",color="r",label="test2") ax2.set_xlim(0,5) ax2.set_ylim(0,20) ax2.set_xlabel("[s]") ax2.set_ylabel("[h]") ax2.legend(loc="upper right")

今回、次のように1行目と2行目に説明文があり、3行目から数値が並んでいるCSVファイルを想定しました。

f:id:stjun:20190724221216p:plain

上記のコードを実行すると次のように列ごとに数値を読みだし、配列を作ってくれます。

f:id:stjun:20190724221311p:plain

matplotlibを使えばグラフ化も簡単です.

f:id:stjun:20190724221555p:plain

 

■説明

CSVの読み取りはnumpyのloadtxtを使うと非常に簡単です。

data_1, data_2,data_3= np.loadtxt("./data02.csv", skiprows=2, unpack=True)

まず読み取りたい列が3つあるので変数は3つ用意してあげます。今回は分かりやすいようにdate_1~date_3としました。読み取りたい列が5列あるなら5個分の変数を用意してあげましょう。

またskiprows=2は先頭から2行分をとばして3行目から読み込むという意味です。今回CSVファイルの1行目と2行目が説明文なのでskiprows=2としています。説明文が10行ある場合はskiprows=10としましょう。

これで終了です。loadtxtには他にも機能がいくつかあったり、データの読み出し方も色々変更できますが、まずはこの方法で十分だと思います。

 

■最後に

最近、本業が非常に忙しくあまりpythonに触れられてないですが少しづつ更新をしたいと思います。