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.
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
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é
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é