Poussez stdout dans numpy.loadtxt

Résumé

Comment insérer la sortie de stdout directement dans numpy.loadtxt au cas où vous voudriez analyser les données traitées par awk avec python numpy.

Chose que tu veux faire

Par exemple, supposons que vous ayez des données sur le nom, la taille et le poids.

input.dat


Yamada 160 50
Tanaka 170 60
Sakana 180 70

Supposons que vous souhaitiez extraire uniquement la partie numérique et mettre en corrélation la hauteur et le poids. Vous pouvez le faire avec Python, mais c'est gênant lorsque le fichier grossit, alors utilisez awk et utilisez numpy.loadtxt pour lire les données numériques. En d'autres termes, cela ressemble à ceci.

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

#Après ça, j'ai analysé ça a raté

Cependant, il est difficile d'obtenir un fichier intermédiaire. Je veux que ça ressemble à ça.

$ python analysis.py input.dat

Choses à faire

Tout d'abord, utilisez le sous-processus pour utiliser les commandes shell dans Python. Placez la sortie finale dans subprocess.PIPE et placez-la dans 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 )

#Après ça, j'ai analysé ça a raté

autres

Dans le script ci-dessus, la commande shell a été écrite en Python, mais le contenu du script awk est différent à chaque fois.

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

Si vous voulez vous connecter avec un tube comme celui-ci, utilisez fileinput.

analysis.py


import numpy as np
import fileinput

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

#Après ça, j'ai analysé ça a raté

Recommended Posts

Poussez stdout dans numpy.loadtxt
Mettez des tampons de protocole dans sqlite avec python