2011-07-15 48 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