2011-07-15 50 views
8

我想使用子进程从python调用sed。我尝试使用的脚本如下。但是,这将sed输出传输到标准终端。似乎'>'操作符不能从我的subprocess.call语句中识别。有什么建议么?Python - 使用子进程调用sed?

import sys 
import os 
import subprocess 

files = os.listdir(sys.argv[1]) 

count = 0 

for f in files: 
    count += 1 
    inp = sys.argv[1] + f 
    outp = '../' + str(count) + '.txt' 
    sub = subprocess.call(['sed', 's/\"//g', inp, '>', outp]) 

另外 - 我的文件名中有空格,即“file1 .txt”。这可能是问题吗?当我从终端调用sed时,我的sed命令正常工作,而不是从脚本中调用。

谢谢。

+3

任何理由不在Python本身做到这一点? – robert

+1

@robert +1这是一个很好的观点,你应该提供它,包括解决方案,作为答案。 – Nix

回答

11

使用

out_file = open(outp, "w") 
sub = subprocess.call(['sed', 's/\"//g', inp], stdout=out_file) 
+0

@robert,我havnt有这样的咖啡,但我没有看到任何空间? – Nix

+0

这很有道理。谢谢! D :-) –

6

这将是更快跳过运行的所有进程的sed,只是做的工作在Python

import os 
import sys 
files = os.listdir(sys.argv[1]) 

for count, f in enumerate(files): 
    with open(os.path.join(sys.argv[1],f), "r") as source: 
     with open(os.path.join('..',str(count)+'.txt'), "w") as target: 
      data= source.read() 
      changed= source.replace('"','') 
      target.write(changed) 

这将大大加快运行,因为它不会叉很多子流程。

+3

我认为它应该是'changed = data.replace(''','')'而不是。 – msakya