Python 在循环中对每个文件运行shell命令,以将每个文件从标量转换为相应的csv

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

我需要完成以下任务,将不胜感激

我以同样的方式运行shell命令
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命令在脚本中的作用,我是否可以禁用它,使其不应显示在终端上。