Python 在循环中对每个文件运行shell命令,以将每个文件从标量转换为相应的csv
我需要完成以下任务,将不胜感激 我以同样的方式运行shell命令Python 在循环中对每个文件运行shell命令,以将每个文件从标量转换为相应的csv,python,shell,csv,scalar,Python,Shell,Csv,Scalar,我需要完成以下任务,将不胜感激 我以同样的方式运行shell命令 scavetool x A.sca-o A.csv scavetool的这个命令将标量文件转换为我的Ubuntu终端上相应的csv文件。例如,运行此命令后,它将A.sca文件转换为相应的A.csv文件,文件名相同,但扩展名仅更改为.csv. 因此,我的100文件的开头完全像这样A-#0.sca,A-#1.scaA-#2.sca等等,最多100个,我想把它们转换成相应的csv文件,比如A-#0.csv,A-#1.csv,A-/csv
scavetool x A.sca-o A.csv
scavetool的这个命令将标量文件转换为我的Ubuntu终端上相应的csv文件。例如,运行此命令后,它将A.sca
文件转换为相应的A.csv
文件,文件名相同,但扩展名仅更改为.csv.
因此,我的100
文件的开头完全像这样A-#0.sca
,A-#1.sca
A-#2.sca
等等,最多100个,我想把它们转换成相应的csv
文件,比如A-#0.csv
,A-#1.csv
,A-/csv>,A-/csv>等等
我需要在Python中执行此操作,并且我知道如何通过os.system
在Python脚本中运行terminal命令,如下所示:
例如os.system(“命令”)
到目前为止,我的代码看起来像这样
#!/usr/bin/python3
import csv, os, glob
for file in glob.glob('*.sca'):
os.system('scavetool x *sca -o *.csv')
然而,问题是,它将我所有的标量文件转换为一个.csv
文件,我知道这是因为*
符号。但我也尝试在每个文件上循环,但我没有获得所需的输出,因为使用循环时,我的scavetool命令会发出抱怨,并且我无法将每个单独文件的输出作为单独的csv
文件
请帮助实现此目标。尝试以下操作:
import subprocess, glob
for file in glob.glob('*.sca'):
command = 'scavetool x {}.sca -o {}.csv'.format(file[:-4], file[:-4])
subprocess.call(command, shell=True)
Gl Hf:)您可以使用glob.glob(“*.sca”)
搜索文件,这样您就知道所有文件都将以.sca
结尾。诀窍就是忘记所有文件名的最后3个字符,并添加正确的扩展名。顺便说一句,format
很乐意重复相同的替换,只要您在大括号({i}
)内给出数字。代码可能成为
for file in glob.glob('*.sca'):
command = "scavetool x {0}sca -o {0}csv".format(file[:-3])
print(command) # to control the command
# subprocess.call(command, shell=True) # and execute when it looks correct
嗯,您的脚本可能会尝试将-#0.sca.sca转换为-#0.sca.csv,这并不是真正需要的:-(@Clem谢谢,但是这些花括号{}
中应该包含什么,因为在我将其留空时,它会抛出错误,就像您提到的那样。但即使是我也尝试了命令='scavetool x A-#{}.sca-o A-{}.csv'(文件,文件)
但是它抛出了这个错误scavetool:无法打开'A-#A-#1.sca.sca'进行读取
。yes@Serge Ballesta是对的。@Serge yes你是对的,忘记了删除文件扩展名的[:-3]。Linux风扇:Serge的修改可以做到这一点:)在尝试执行命令之前,只需打印它们……如果您能够打印所有*.sca
文件以及相应的xxx.csv
的列表,那么在循环中执行命令将是微不足道的。无论如何,我无法想象另一种方式。谢谢,它可以工作,但还有一件事类似于我运行脚本时显示的在终端上显示一条消息,说明shell命令在脚本中的作用,我是否可以禁用它,使其不应显示在终端上。