2011-07-15 21 views
8

Deseo llamar al sed desde python usando el subproceso. El script que probé usar está abajo. sin embargo, esto canaliza la salida sed a la terminal estándar. Parece que el operador '>' no se reconoce desde mi declaración de subprocess.call. ¿Alguna sugerencia?Python: ¿usar el subproceso para llamar a 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]) 

También - mis nombres de archivo tienen espacios en ellos, es decir, "archivo1 .txt". ¿Podría ser éste el problema? Mi comando sed funciona bien cuando llamo a sed desde la terminal, pero no desde la secuencia de comandos.

Gracias.

+3

¿Alguna razón para no hacer esto en Python? – robert

+1

@robert +1 es un gran punto, debe ofrecerlo, incluida la solución, como una respuesta. – Nix

Respuesta

11

Uso

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

@robert, no he tomado café, ¿pero no veo ningún espacio? – Nix

+0

Eso tiene sentido. ¡Gracias! D :-) –

6

Sería mucho más rápido para saltar correr todos los procesos de sed y sólo hacer el trabajo en 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) 

Esto ejecutará mucho más rápido, ya que no se bifurcará una gran cantidad de subprocesos.

+3

Creo que debería ser 'changed = data.replace ('"', '') 'en su lugar. ¿Verdad? – msakya

Cuestiones relacionadas