[PYTHON] Schieben Sie stdout in numpy.loadtxt

Zusammenfassung

So fügen Sie die Ausgabe von stdout direkt in numpy.loadtxt ein, wenn Sie die von awk mit python numpy verarbeiteten Daten analysieren möchten.

Was du machen willst

Angenommen, Sie haben Daten zu Name, Größe und Gewicht.

input.dat


Yamada 160 50
Tanaka 170 60
Sakana 180 70

Angenommen, Sie möchten nur den numerischen Teil extrahieren und Größe und Gewicht in Beziehung setzen. Python kann das, aber es ist umständlich, wenn die Datei größer wird. Verwenden Sie also awk und numpy.loadtxt, um die numerischen Daten zu lesen. Mit anderen Worten, es sieht so aus.

$ 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])

#Danach analysierte ich es durcheinander

Es ist jedoch schwierig, eine Zwischendatei zu erhalten. Ich möchte, dass es so aussieht.

$ python analysis.py input.dat

Dinge die zu tun sind

Verwenden Sie zunächst den Unterprozess, um Shell-Befehle in Python zu verwenden. Fügen Sie die endgültige Ausgabe in subprocess.PIPE und in numpy.loadtxt ein.

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 )

#Danach analysierte ich es durcheinander

Andere

Das obige Skript hat Shell-Befehle in Python geschrieben, jedoch aufgrund von Umständen wie dem Inhalt des awk-Skripts, der jedes Mal anders ist.

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

Wenn Sie eine Verbindung mit einer solchen Pipe herstellen möchten, verwenden Sie fileinput.

analysis.py


import numpy as np
import fileinput

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

#Danach analysierte ich es durcheinander

Recommended Posts

Schieben Sie stdout in numpy.loadtxt
Fügen Sie Protokollpuffer mit Python in SQLite ein