将从bash脚本输出的多个文件导入Python列表

时间:2017-07-26 17:10:31

标签: python bash matplotlib io

我有一个连接到多个计算节点的bash脚本,并根据调用bash脚本后输入的一些参数从每个计算节点中提取数据。为简单起见,我基本上是这样做的:

for h in node{0..7}; do ssh $h 'fold -w 80 /program.headers | grep "RA" 
| head -600 | tr -d "RA =" > '$h'filename'; done

我试图获取由此产生的8个文件(每个文件有600条信息)并将它们作为列表保存在Python中。然后我需要在Python中操作它们(拆分并转换为float)以便能够使用Matplotlib绘制数据。

对于只输出一个文件的bash脚本,我可以轻松地使变量名等于check_output,然后从那里进行操作:

test = subprocess.check_output("./bashscript")
test_list = test.split()
test = [float(a) for a in test_list]

我还可以使用以下方法从我的bash脚本中读取已保存的文件:

test = subprocess.check_output(['cat', '/path/filename'])
test_list = test.split()
test = [float(a) for a in test_list]

问题是,在我得到所有我需要的东西后,我正在使用80多个文件。在Python中是否有某种方式可以说,"对于每个文件,将其内容存储为列表"?

2 个答案:

答案 0 :(得分:0)

在bash脚本和python脚本之间定义一个简单的界面

看起来简单的界面曾经是文件的打印,但是这个解决方案没有扩展到多个文件。现在,我建议界面打印出创建的文件的名称。它看起来像这样:

filenames = subprocess.check_output("./bashscript").split()
for filename in filenames:
    with open(filename) as file_obj:
        file_data = [float(a) for a in file_obj.readlines()]

看起来你对Python不熟悉但熟悉bash。结果,你在bash拐杖上编程蹒跚而不是你应该拥抱Python并在你的应用程序中使用它。您可能根本不需要bash脚本。

答案 1 :(得分:0)

您可以使用os.popen()来执行脚本,而不是使用子进程捕获数据。使用它的好处是,您可以在读取文件时读取命令/脚本的输出。因此,您可以根据自己的愿望使用read(), readlines(),readline(),所有这些都会为您提供一份清单。通过使用它,您可以像这样执行脚本和捕获输出

import os
output=os.popen("./bashscript").readlines() #now output has the op of bashsceipt with each line as a seperate item as list.

check this了解有关如何使用os.popen()的更多信息。 check this了解read(),readlines(),readline(),xreadlines()

之间的区别