LoginSignup
1
2

More than 5 years have passed since last update.

stdout を numpy.loadtxt に突っ込む

Posted at

まとめ

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())

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

1
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2