python - Python 外部可执行文件输出为二维数组
问题描述
如何将外部可执行文件的输出作为二维数组获取?
import os
import subprocess
proc = subprocess.Popen(['C:\\bin\\test.exe', '-b10.10.2000','-house50.20E,10.40N','-hsyE','-utc00.18','-eswe','-sid27','-fPls','-head','-g'], stdout=subprocess.PIPE).communicate()
输出 -
>>> print (proc)
(b'Sun \t 173.1483122\t 0.9880656\r\nMoon \t 313.0306463\t 12.386413
2\r\nMercury \t 198.1580011\t 0.7897290\r\nVenus \t 204.8965900\t 1.2175
754\r\nMars \t 140.5897149\t 0.6242807\r\nJupiter \t 47.2090321\t -0.035
0736\r\nSaturn \t 36.4696238\t -0.0472129\r\nUranus \t 293.1678525\t -0.01
36009\r\nNeptune \t 279.9571737\t -0.0031065\r\nPluto \t 226.9850014\t 0.
0259009\r\nmean Node \t 86.2385757\t -0.0529828\r\ntrue Node \t 86.8486961\t -0.
1297016\r\nmean Apogee \t 270.9593053\t 0.1107212\r\nhouse 1 \t 135.1767780\r\n
house 2 \t 165.1767780\r\nhouse 3 \t 195.1767780\r\nhouse 4 \t 225.17
67780\r\nhouse 5 \t 255.1767780\r\nhouse 6 \t 285.1767780\r\nhouse 7
\t 315.1767780\r\nhouse 8 \t 345.1767780\r\nhouse 9 \t 15.1767780\r\nhouse 1
0 \t 45.1767780\r\nhouse 11 \t 75.1767780\r\nhouse 12 \t 105.1767780\r\n
Ascendant \t 135.1767780\r\nMC \t 46.8522202\r\nARMC \t 69.1022
636\r\nVertex \t 351.3888546\r\nequat. Asc. \t 133.5633351\r\nco-Asc. W.Koch \t
131.6974530\r\nco-Asc Munkasey\t 149.4317411\r\nPolar Asc. \t 311.6974530\r\n', None)
>>>
数组应该像这个原始输出 -
Sun 173.1483122 0.9880656
Moon 313.0306463 12.3864132
Mercury 198.1580011 0.7897290
Venus 204.8965900 1.2175754
Mars 140.5897149 0.6242807
Jupiter 47.2090321 -0.0350736
Saturn 36.4696238 -0.0472129
Uranus 293.1678525 -0.0136009
Neptune 279.9571737 -0.0031065
Pluto 226.9850014 0.0259009
mean Node 86.2385757 -0.0529828
true Node 86.8486961 -0.1297016
mean Apogee 270.9593053 0.1107212
house 1 135.1767780
house 2 165.1767780
house 3 195.1767780
house 4 225.1767780
house 5 255.1767780
house 6 285.1767780
house 7 315.1767780
house 8 345.1767780
house 9 15.1767780
house 10 45.1767780
house 11 75.1767780
house 12 105.1767780
Ascendant 135.1767780
MC 46.8522202
ARMC 69.1022636
Vertex 351.3888546
equat. Asc. 133.5633351
co-Asc. W.Koch 131.6974530
co-Asc Munkasey 149.4317411
Polar Asc. 311.6974530
0
解决方案
它看起来像 CSV 文件(逗号分隔值),但带有制表符而不是逗号。
因此,您可以将数据保存在文件中并使用模块csv
来读取它。
或者您可以使用io.StringIO
在内存中创建假文件并用于csv
读取它
data = (b'Sun \t 173.1483122\t 0.9880656\r\nMoon \t 313.0306463\t 12.386413\
2\r\nMercury \t 198.1580011\t 0.7897290\r\nVenus \t 204.8965900\t 1.2175\
754\r\nMars \t 140.5897149\t 0.6242807\r\nJupiter \t 47.2090321\t -0.035\
0736\r\nSaturn \t 36.4696238\t -0.0472129\r\nUranus \t 293.1678525\t -0.01\
36009\r\nNeptune \t 279.9571737\t -0.0031065\r\nPluto \t 226.9850014\t 0.\
0259009\r\nmean Node \t 86.2385757\t -0.0529828\r\ntrue Node \t 86.8486961\t -0.\
1297016\r\nmean Apogee \t 270.9593053\t 0.1107212\r\nhouse 1 \t 135.1767780\r\n\
house 2 \t 165.1767780\r\nhouse 3 \t 195.1767780\r\nhouse 4 \t 225.17\
67780\r\nhouse 5 \t 255.1767780\r\nhouse 6 \t 285.1767780\r\nhouse 7\
\t 315.1767780\r\nhouse 8 \t 345.1767780\r\nhouse 9 \t 15.1767780\r\nhouse 1\
0 \t 45.1767780\r\nhouse 11 \t 75.1767780\r\nhouse 12 \t 105.1767780\r\n\
Ascendant \t 135.1767780\r\nMC \t 46.8522202\r\nARMC \t 69.1022\
636\r\nVertex \t 351.3888546\r\nequat. Asc. \t 133.5633351\r\nco-Asc. W.Koch \t\
131.6974530\r\nco-Asc Munkasey\t 149.4317411\r\nPolar Asc. \t 311.6974530\r\n', None)
import io
import csv
# output from process
text = data[0].decode()
print(text)
# create fake file in memory with text data
fake_file = io.StringIO(text)
# create CSV reader
reader = csv.reader(fake_file, delimiter='\t')
# read all data from CSV file
data = list(reader)
# remove spaces
data = [[x.strip() for x in row] for row in data]
for row in data:
print(row)
结果 - 行
['Sun', '173.1483122', '0.9880656']
['Moon', '313.0306463', '12.3864132']
['Mercury', '198.1580011', '0.7897290']
['Venus', '204.8965900', '1.2175754']
['Mars', '140.5897149', '0.6242807']
['Jupiter', '47.2090321', '-0.0350736']
['Saturn', '36.4696238', '-0.0472129']
['Uranus', '293.1678525', '-0.0136009']
['Neptune', '279.9571737', '-0.0031065']
['Pluto', '226.9850014', '0.0259009']
['mean Node', '86.2385757', '-0.0529828']
['true Node', '86.8486961', '-0.1297016']
['mean Apogee', '270.9593053', '0.1107212']
['house 1', '135.1767780']
['house 2', '165.1767780']
['house 3', '195.1767780']
['house 4', '225.1767780']
['house 5', '255.1767780']
['house 6', '285.1767780']
['house 7', '315.1767780']
['house 8', '345.1767780']
['house 9', '15.1767780']
['house 10', '45.1767780']
['house 11', '75.1767780']
['house 12', '105.1767780']
['Ascendant', '135.1767780']
['MC', '46.8522202']
['ARMC', '69.1022636']
['Vertex', '351.3888546']
['equat. Asc.', '133.5633351']
['co-Asc. W.Koch', '131.6974530']
['co-Asc Munkasey', '149.4317411']
['Polar Asc.', '311.6974530']
第二种方法:
您来自流程的数据是一个字符串,因此您也可以使用split('\n')
, split('\t')
,strip()
创建二维列表。
data = (b'Sun \t 173.1483122\t 0.9880656\r\nMoon \t 313.0306463\t 12.386413\
2\r\nMercury \t 198.1580011\t 0.7897290\r\nVenus \t 204.8965900\t 1.2175\
754\r\nMars \t 140.5897149\t 0.6242807\r\nJupiter \t 47.2090321\t -0.035\
0736\r\nSaturn \t 36.4696238\t -0.0472129\r\nUranus \t 293.1678525\t -0.01\
36009\r\nNeptune \t 279.9571737\t -0.0031065\r\nPluto \t 226.9850014\t 0.\
0259009\r\nmean Node \t 86.2385757\t -0.0529828\r\ntrue Node \t 86.8486961\t -0.\
1297016\r\nmean Apogee \t 270.9593053\t 0.1107212\r\nhouse 1 \t 135.1767780\r\n\
house 2 \t 165.1767780\r\nhouse 3 \t 195.1767780\r\nhouse 4 \t 225.17\
67780\r\nhouse 5 \t 255.1767780\r\nhouse 6 \t 285.1767780\r\nhouse 7\
\t 315.1767780\r\nhouse 8 \t 345.1767780\r\nhouse 9 \t 15.1767780\r\nhouse 1\
0 \t 45.1767780\r\nhouse 11 \t 75.1767780\r\nhouse 12 \t 105.1767780\r\n\
Ascendant \t 135.1767780\r\nMC \t 46.8522202\r\nARMC \t 69.1022\
636\r\nVertex \t 351.3888546\r\nequat. Asc. \t 133.5633351\r\nco-Asc. W.Koch \t\
131.6974530\r\nco-Asc Munkasey\t 149.4317411\r\nPolar Asc. \t 311.6974530\r\n', None)
text = data[0].decode()
print(text)
data = [[x.strip() for x in row.split('\t')] for row in text.split('\n') if row.strip()]
for row in data:
print(row)
结果与第一种方法相同。
推荐阅读
- git-checkout - git --git-dir checkout 和 git checkout 的区别
- java - 如何杀死在后台运行的线程 - Java?
- java - 如何使用http请求获取特定数据?
- javascript - Angular 2 使用 ngfor 获取 json 数据
- mule - Mule 4.1.2 自定义连接器错误
- regex - 前瞻前的懒惰正则表达式:不使用`.+?`
- c++ - 无法从 cpp 代码将参数传递给 R 函数
- php - Laravel 标头在中间件中被剥离
- python - Pcolormesh 没有采用正确的坐标
- sql - 编写删除和创建所有外键的脚本