pythonでのテキストデータの入出力方法いろいろ

この投稿ではpythonでテキストデータを処理するときの、データの入出力方法いろいろについてまとめたい。 いやまとめというか私がよく使っている方法を書くだけだが。 ついでにそんなにいろいろもなかったが。

データの読み込みの方法

スクリプトを書くときは、何かしらデータを読み込んで処理を加えて結果なりなんなりを出力させるってプロセスを経ることは多いと思う。 そうするには最初にデータを読み込む必要がある。
データといっても千差万別なので、データによって読み込み方法を変える必要がある。 既にraw画像の読み込みの仕方について投稿を一つ書いてあるので、興味があればそちらもご覧いただきたい。
この投稿ではテキストデータを読み込む場合について書きたいと思う。 テキストデータといっても、数値や文字などいろいろな種類がある。 数値データ一つをとっても、整数や小数などデータタイプの違いがある。 さらにそれらの混合タイプのデータもあるので、読み込むためには色々と設定が必要なこともある。

数値データの読み込み方法

さてまずはシンプルな区切り数値データを読み込む場合。 便利なのはnumpyのloadtxt。 いずれにしろpythonで計算などをする場合はnumpyでプロセスしたい場合が多いので、numpyのarrayに直接入れられる方が便利だろう。

pwd = np.loadtxt(argvs[1])

といった感じで読み込む。 データの形式を指定する必要がある場合は、dtypeでint,float,doubleなど。 delimiterも必要ならばtabやspaceなど指定できるが、あまり必要ないことが多い。
問題点は同じ行列数のデータでないとエラーを吐き出す。 ヘッダーやコメントが付いているくらいなら、skiprowsで最初の行を飛ばしたりcommentsを利用して指定文字で始まる行をスキップしたりはできる。
これを書くのに公式マニュアルを確認していたら、convertersっていうオプションが追加されていた。 これを使うともう少し便利なのかもしれないが、まだ試してはいない。

文字と数値データが混ざっている場合

上記の方法は一行に数値と文字データが混ざっているようなテキストには普通は使えないことが多い。 文字データだけを読み込みたい場合は、目的に合わせてreadやreadline、readlinesを使って読み込めば良いだろう。 文字データと数値データが混ざっている場合も基本的には同じ方針で読み込める。
さて数値データを抜き出したい場合だが、例えばスペース区切りのテキストだったら以下のように読み込むことができる。 この投稿ではインポートは省略しているので、適時必要なパッケージはインポートしていただきたい。

try:
f = open('input.txt')
except IndexError:
print ('cannot open input file')
else:
input = f.readline().split()
f.close()

このようにして、スペース区切りのテキストがinput[i]に収納することができる。 こうして得られるinput[i]は文字列なので、数字として使いたい場合は変換する必要がある。 int(input[1])やfloat(input[2])などといった感じで。 Read系統を使っていく利点は、間違いなく読み込みはできること。 あとはどう読み込んだデータを使って行くかを工夫して行けば良い。
さてもうちょっとマシなデータフォーマットが整っている場合だと直接numpyに突っ込みたい時もある。 そんな時に便利なのがnumpyのgenfromtxtだ。

temp = np.genfromtxt(argvs[2],dtype=['U8','int','U8','U8','int','float','float','float','float','float'],skip_header=4)

例えばこんな感じで色々混ざったデータを読み込んで、その中の数値データだけを計算に使うなどといったことができる。 genfromtxtは多くのオプションがあるので、色々と読み込みの設定ができる。

2018年3月31日追記:

genfromtxtについてもう少し書いた記事を投稿した。

リンク:pythonを使って座標変換計算 〜回転行列を使って座標回転

EXCELデータの読み込みの方法

2017年12月10日追記:
色々試したけれど、EXCEL系のデータは有名パッケージのpandasがどうにも優秀だった。 まずはインポート。

import pandas as pd

それからエクセルシートをread_excelを使ってダイレクトに読み込む。 filenamesはtkinterで取得。 tkinterの使い方に興味がある方は投稿下部の関連記事から。 それから読み込むsheet名の指定。 それからsheetのデータを読み込む。

excel = pd.read_excel(filenames[0], sheetname='Sheet1')
data = excel.values

これで各行列が読み込まれている。 例えば何かしらプロットデータだったら下のように列を指定してあげればプロットできる。 便利。

plt.plot(data[:,0], data[:,1])

データの書き出しの方法

numpyの数値データを書き出す場合、単純にsavetxtというオプションを使ってあげれば良い。

np.savetxt('name.txt', DATA)

といった具合。
genfromtxtなどで読み込んだ文字列と数値が混ざったテキストを出力したい場合もsavetxtで良い。 ただしフォーマットを指定してあげる必要がある。 これは結晶のpdbフォーマットでの出力の例。

np.savetxt('test.pdb',dft_pdb,fmt='%4s %6d %3s %-4s %2d %11.3f %7.3f %7.3f %4.3f %5.2f')

numpyデータでない場合は、readと同じように書き込みモードでファイルを開てwriteやwritelinesを使って出力する。
あと便利なのは同じように書き込みモードでファイルを開いておいて、プリントでファイルに書き込んでいく方法。 ファイルにスクリプトの違う場所から次々と書き込んでいきたいときなどに便利。 この例では文字列だがもちろんデータも書き込める。

res = open('result.txt','w')
print ("test test test",file=res)

以上。 新しい入出力を試す機会があったら追記する。

関連記事

pythonのまとめ

D