python子进程调用的sed中的转义错误

python子进程调用的sed中的转义错误,python,string,sed,subprocess,escaping,Python,String,Sed,Subprocess,Escaping,我试图使用subprocess.check_调用调用sed,如下所示 with open(output_file,'w+') as f: subprocess.check_call(['sed', r':a;s/^\(\([^"]*,\?\|"[^",]*",\?\)*"[^",]*\),/\1 /;ta s/,$//; s/\.00//g; s/"//g', input_file], stdout = f, shell=True) 然而,我得到了这样一个错误的答案 '\"[^\"'

我试图使用subprocess.check_调用调用sed,如下所示

with open(output_file,'w+') as f:
    subprocess.check_call(['sed', r':a;s/^\(\([^"]*,\?\|"[^",]*",\?\)*"[^",]*\),/\1 /;ta s/,$//; s/\.00//g; s/"//g', input_file], stdout = f, shell=True)
然而,我得到了这样一个错误的答案

'\"[^\"' is not recognized as an internal or external command, operable program or batch file. 

命令sed:a;s/^\\[^]*,\?\\\\\\\[^,]*,\?\*[^,]*,/\1/;ta s/,$/;s/\.00//g;s///g'input\u file>output\u file在bash中独立工作,因此我怀疑这是由某个转义问题引起的。

直接的问题是您正在传入一个包含;不引用shell=True;但是,鉴于您已经在将命令解析为令牌,您在这里不需要或不希望shell=True,因此立即的解决方法就是删除它。看看它意味着什么,为什么这里是错误的,为什么你通常想要避免它

但是,sed脚本似乎试图将CSV转换为以空格分隔的格式,保留带引号的字段,但删除任何引号。有一个用于解析CSV的Python库,它可能做得更好

import csv

with open(inputfile, 'r') as inp, open(output_file, 'w+') as out:
    reader = csv.reader(inp)
    writer = csv.writer(out, delimiter=' ', quoting=csv.QUOTE_NONE)
    for row in reader:
        for k in row:
            row[k] = row[k].replace('.00', '')
         writer.writerow(row)

这是临时性的,可能需要一些调整,我可能忽略或误解了sed脚本中的一些细节,但应该可以让您了解如何完全摆脱子流程,并且可能对脚本的执行有更多的控制,并且有机会在三个月后理解它。

shell=True在传入令牌列表而不是shell要解析的单个字符串时是错误的。您几乎肯定想用Python函数替换sed脚本,尽管没有解释它应该完成什么,我不会尝试临时创建一个。另请参见我在发布问题时将问题略为缩写。事实上,该文件位于远程服务器上,我试图调用psexec在远程服务器上执行sed,因此无需通过网络传输输入。