プログラミング言語「python」を用いてシステム開発をしよう!

データ解析システムにおいて非常に大切なことは
データの読み込み、及び書き込みができることである。
まぁ、当たり前のことですけどね。。。

pythonコードでのデータの読み込み、書き込みは非常にシンプルです。
このページでは「テキストファイル」の読み込みや書き込みの仕方を記述します。

ここで言うテキストファイルとは、拡張子が「.txt」「.log」「.data」等であり、
なおかつTeraPadやWardPad、メモ帳などで読み込みが可能なものを指します。

さらに、データの読み書きにおいて事前に知っておかなければならない大切なことがあります。
それはテキストの読み書きはすべて文字列として扱われるということです。
つまり、データの読み込みで取得したデータ列のタイプは「文字列」ですし、
書き込み可能なデータ列のタイプももちろん「文字列」です。
ゆえに数値データ「1234」をテキストに書き込みたい場合は、あらかじめstr(1234)として
数値列を文字列に変換しておかなければなりません。
逆に読み込んだ数値文字列を演算可能にするためにはfloat(取り込んだ数値文字列)として
文字列を数値列に変換しましょう。


データの読み込み

pythonコードにおいてテキストファイルの読み込みを行う際には
特別なモジュールのインポートは必要ありません。
ただ、1点だけ注意してください。

・読み込むテキストファイルはプログラムと同じ階層(フォルダ)にあること

もちろん、ディレクトリの移動をつかさどる「osモジュール」をインポートしていれば
この上ではありませんが、そうでない場合はプログラムと同じ場所にデータファイルを置いておきましょう。

pythonコードでのテキストの読み込みは「1行」を単位として行われます。
要するに「列という概念はなく、一つの行で一つの枠(データ)ととらえられ、その枠(データ)を一気に読み込む」のです。
イメージがつかめない人は、以下で記載されている読み込み例を見て理解してください。

pythonコードにはテキストデータの読み込み方法として2種類が用意されています。

1行だけを読み込む

あるテキストデータがあり、そのデータの「1行だけ」を読み込みたい場合は次のようにコーディングします。

f=open('sample.txt','r')
text=f.readline()

print text

f.close()

今回は「sample.txt」というテキストデータを読み込んでいます。
テキスト読み込みの際には、まずどのテキストを読み込むのか指定してあげる必要があります。
それが1行目のopen('sample.txt','r')です。
拡張子までしっかりと記載しなくてないけないという点に注意しましょう。
また、'r'とは読み込みを表す「read」の頭文字です。
実際にテキストファイルからデータを取り込むコマンドはreadline()です。
このコードでは読み込んだデータを「text」に格納し、print文によってターミナルに出力しています。
読み込みが終わったら、close()でテキストファイルを閉じておきましょう。

では、実際にデータファイル(左図)と出力結果(右図)を見てください。
ターミナルに出力されているのは「1行だけ」ですね。
このようにreadline()コマンドは「1行」を単位として「1行だけ」を読み込みます。
よって、データファイルにある3行をすべて読み込んで出力したいのならば
f=open('sample.txt','r')

text=f.readline()
print text
text=f.readline()
print text
text=f.readline()
print text
f.close()
と、readline()コマンドを3回書かなければいけません。

readline()コマンドは、close()ファイルを閉じない限り先頭の行から順番に読み込みを行っていきます


すべての行(データ)を読み込む

通常、数値解析データともなると、データ数は莫大なものとなる。
ということは、単純に考えてテキストデータの行数は膨大な行になる。
そのようなデータに対して、上記の「1行だけを読み込む」を使うともなれば・・・
うん、泣くしかないですね。。。

もちろん、そんな理不尽な読み込み方法ではなく、とてもスマートな読み込み方法がある。
それがreadlines()だ!

「ん?ただ 's' がついただけじゃん!」

いえいえ、それに意味があるんですよ。だって英単語の名詞の最後に 's' がつくと複数形を意味するじゃないですか。
というわけでreadlines()は複数行のデータ読み込みに適した処理である。

「複数行」といっても同時にたくさんの行を取得するわけではない。
下のコードを見てもらいたい。
f=open('sample.txt','r')

for i in f.readlines():
  print i

f.close()

このようにreadlines()for文と共に利用し、
forループの力を借りてテキストの1行目から順々にデータを取得していくのだ。
3行目のprint iでお分かりのとおり、テキストデータから取得した値は一時的に変数「i」に格納される。

もちろん、テキストの最終行までデータの取得が完了したら自動的にfor文から抜けてくれる。



読み込んだデータ列をすっきりさせる

テキストデータの読み込みはばっちり!

「じゃぁ、あとはデータを格納してリストに加えていき、計算するだけだー!」
「ばんざーい!!」
「・・・」
「あれ?エラーが出るんだけど・・・?なんで?」

こんな経験をした人も多いのではないだろうか。
ちゃんとデータの取り込みもできたのに何が問題なんだ?
それは上記の「データの読み込み」例の出力結果(すべてのデータを読み込む)を見ればわかる。

・値の間に空白(tab)が入っている
・出力されたデータ行とデータ行の間に空白行(改行)が入っている

この2点が問題を起こしていたのである。
「本当に空白文字と改行文字が入っているのか?」
と疑問に思う方は上記コードのprint iの部分をprint list(i)と変更して実行してほしい。
すると次のように出力されるだろう。

['1', '2', '3', '4', '\t', '5', '6', '7', '8', '9', '\n']

このように1234と56789の間には「\t(tabコマンド)」が、行末には「\n(改行コマンド)」が挿入されている。
tabコマンドと改行コマンドが挿入されてしまった所以は読み込んだテキストデータの書き込み形式にある。
上の「sample.txt」を見ていただきたい。値の間には空白(tab)が、行末には↓(改行)が挿入されているのが分かる。
pythonはデータ読み込みの際、この空白コマンドと改行コマンドを素直にデータとして取り込んでしまったのです。
つまり、値を読み込むためにはデータ列から余計な部分を除去しなければならない。
ここでデータ列(文字列)の整理に欠かせないメソッドをあげておこう。

末尾の改行コマンドを取り除く
データ末尾の改行コマンドを取り除きたい場合はstrip()を用いる。

文字列を任意の文字列で区切り、リストを作成する
文字列データを指定した文字列で区切り、リストとして格納するにはsplit()を用いる。
区切りの指定文字はsplit()のカッコ内に記述する。
たとえば文字列「text='abcdef'」があり、cを基準に文字列を区切りたい場合
text=text.split(' c ')
とコーディングすると、textに格納される値は
text=[ 'ab' , 'def' ]
となる。ここで、区切りの指定文字の情報は消えてしまう(リストには格納されない)ことに注意していただきたい。
このメソッドを使えば、値の間にある空白文字(tab)を除去できるだけでなく、同時に値のリストまで作成できる。
まさに一石二鳥といった感じですね。


以上をもとに、[すべての行(データ)を読み込む]の単元で出力された「整理されていないデータ列」を
整理された状態にまでもっていきましょう。この処理までして、はじめてデータを数値解析できます!
それでは書き直されたコードと出力結果を見てください。

f=open('sample.txt','r')

Data-X=[]    #1列目の数値を格納するリスト
Data-Y=[]    #2列目の数値を格納するリスト

for i in f.readlines():
  i=i.strip()    #末尾の改行を除去
  i=i.split(' \t ')    #空白(tab)で文字列を区切り、リストを作成
  Data-X=Data-X+[float(i[0])]    #文字列を数値に変換してリストに格納
  Data-Y=Data-Y+[float(i[1])]    #文字列を数値に変換してリストに格納

f.close()
print Data-X
print Data-Y

あとは、このデータリストを好きなように加工してデータ解析を進めていきましょう。
※ちなみに7,8行目で「??」と思った方はこのページの導入部をご覧ください。




データの書き込み

データ解析プログラムに欠かせないこと、それは計算結果のテキスト書き出しではないだろうか。
いくらターミナル上に計算結果を出力してくれたからと言って、それをいちいちノートに書き写すのは面倒くさい。
というわけで、このセクションではテキストデータへの書き込み方法について記述する。

では例として次のようなデータ列をうまくテキストに書き込むことを考えてみよう。

・実験名は「電流電圧特性」
・Data-Xは電流値のリスト[4, 8]
・Data-Yは電圧値のリスト[40, 80]

それでは書き込み例をご覧ください。

f=open('data.txt','w')

f.write(' #電流電圧特性 ')
f.write(\n)
f.write(' #Data-X(電流) ')
f.write(\t)
f.write(' Data-Y(電圧) ')
f.write(\n)
f.write( Data-X[0] )
f.write( \t )
f.write( Data-Y[0] )
f.write( \n )
f.write( Data-X[1] )
f.write( \t )
f.write( Data-Y[1] )
f.write( \n )

f.close()


いかがでしょうか?コードと書き込み結果(右図)をパッと見ただけでイメージはつかめたでしょうか?
では、簡単に補足説明をしましょう。
1行目open('data.txt','w')ここで新しく「data.txt」というテキストを作っている。'w'は書き込みを意味する。
write()書き込み専用コマンド。文字を書き込むときは(' 文字 ')とし、文字をピリオドで囲むこと。
write(\t)タブスペースを挿入するコマンド。テキスト書き出しの体裁を整えるには非常に有用
write(\n)改行を挿入するコマンド。

ちなみに、文字の先頭に「#」をつけている理由は、もしも書き出したテキストをC言語でコーディングされたプログラムで読み込む際に
「#」で頭付けされている行は無視されるからである。もちろん必要なければつける必要はない。
また、上記コードでは書き込みの構造をイメージしやすいように
f.write(' #電流電圧特性 ')
f.write(\n)
f.write( Data-X[0] )
f.write( \t )
と書いているが、もっとコードをすっきりさせたければ、
f.write(' #電流電圧特性 \n')
f.write( Data-X[0] \t)
としても同様の処理が可能である。



上の例の場合は、書き込むデータ数が少なかったため上記のようなコードでもよいだろうが、
データ数がより膨大だった場合は全く通用しない。
何故かって?
だって、考えてみてくださいよ。
もし電圧のリストが100個あった場合は
f.write( Data-X[ n ] )
の n の部分を0から99まで書けっていうんですか?それは無理ですね。
ということで、データ数が多い場合にはfor文に助けてもらいましょう!
f=open('data.txt','w')

f.write(' #電流電圧特性 ')
f.write(\n)
f.write(' #Data-X(電流) ')
f.write(\t)
f.write(' Data-Y(電圧) ')
f.write(\n)
for i in range( len(Data-X) ):
  f.write( Data-X[i] )
  f.write( \t )
  f.write( Data-Y[i] )
  f.write( \n )

f.close()

とてもすっきりしましたね!
ちなみに、上のコードはfor文を回す回数を「Data-Xリストの長さ」で制御しています。
















python-project

このページへのコメント

参考にして作りましたができません.
以下コードとエラーです.
コード
x=10.0**tt # vofkを更新
y=10.0**y0# vofmpを更新
f = open('cdm_spline.dat','w')
f.write('#vofk \t vofmp\n')
for i in range(len(x)):
f.write( x[i] )
  f.write( \t )
  f.write( y[i] )
  f.write( \n )

f.close()

エラー
File "<ipython-input-22-f65bdc52b17c>", line 7
f.write( \t )
^
SyntaxError: invalid character in identifier

0
Posted by yoshiki 2017年12月08日(金) 18:53:22 返信

こんにちわ、python+matplotlibを使おうとして検索してきました。
matplotlibの前段階の、pythonでのファイル読み込みについて詳しく書かれていてわかりやすかったです!

0
Posted by matplotlibを使おうとしている人 2014年04月09日(水) 20:26:06 返信

qQyOnt Im obliged for the blog.Thanks Again. Will read on...

0
Posted by stunning seo guys 2014年01月20日(月) 20:57:17 返信

vpKfkk <a href="http://syshvfszjyiz.com/">syshvfszjyiz</a>, [url=http://ajgpjokfjjgl.com/]ajgpjokfjjgl[/url], [link=http://duxgyjrsmkum.com/]duxgyjrsmkum[/link], http://jscxrvuhtcmn.com/

0
Posted by xdshtny 2013年11月14日(木) 09:41:32 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます