stdout を numpy.loadtxt に突っ込む

  • 2
    いいね
  • 3
    コメント
この記事は最終更新日から1年以上が経過しています。

まとめ

awk で処理したデータを python の numpy で解析したい、といった場合のために stdout の出力を直接 numpy.loadtxt に突っ込む方法。

やりたいこと

たとえば名前と身長と体重のデータがあるとする。

input.dat
Yamada 160 50
Tanaka 170 60
Sakana 180 70

ここで数値部分だけを抜き出して身長と体重の相関をとりたい、とか思ったとする。Python でもそういう処理はできるけど、ファイルが大きくなると厄介なので awk を使い、数値だけになったデータを numpy.loadtxt で読み出す。つまりこんな感じ。

$ cat input.dat | awk '{print $2, $3}' > tmp.dat
$ python analysis.py tmp.dat
analysis.py
import sys
import numpy as np

data = np.loadtxt(sys.argv[1])

# このあと滅茶苦茶解析した

しかし中間ファイルが出るのが面倒。こういう感じにしたい。

$ python analysis.py input.dat

やること

まず Python 内でシェルコマンドを使うには subprocess を使う。最終的な出力を subprocess.PIPE に出して、それを numpy.loadtxt に入れる。

analysis.py
import sys
import subprocess
import numpy as np

p1 = subprocess.Popen(["cat", sys.argv[1]], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["awk", "{print $2, $3}"], stdin=p1.stdout, stdout=subprocess.PIPE)

data = np.loadtxt( p2.stdout )

# このあと滅茶苦茶解析した

そのほか

上述のスクリプトはシェルコマンドを Python 内に書いたが、awk スクリプトの内容が毎回違うなどの事情で

$ cat input.dat | awk '{print $2, $3}' | python analysis.py

みたいにパイプでつなぎたい場合は fileinput を使う。

analysis.py
import numpy as np
import fileinput

data = np.loadtxt(fileinput.input())

# このあと滅茶苦茶解析した