2011-07-15 15 views
8

Chcę zadzwonić pod numer sed z Pythona za pomocą podprocesu. Skrypt, którego próbowałem użyć, znajduje się poniżej. jednak powoduje wyprowadzenie wyjścia sed do standardowego terminala. Wygląda na to, że operator ">" nie jest rozpoznawany z mojego podprocesu. Jakieś sugestie?Python - używanie podprocesu do wywoływania 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]) 

Ponadto - moje nazwy plików zawierają spacje, tj. "Plik1 .txt". Czy to może być problem? Polecenie sed działa dobrze, gdy wywołuję sed z terminala, ale nie ze skryptu.

Dzięki.

+3

Każdy powód, aby tego nie robić w samym Pythonie? – robert

+1

@robert +1, to świetny argument, powinieneś go zaoferować, łącznie z rozwiązaniem, jako odpowiedzią. – Nix

Odpowiedz

11

Zastosowanie

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

@robert, nie miałem żadnej kawy, ale nie widzę żadnej przestrzeni? – Nix

+0

To ma sens. Dzięki! D :-) –

6

Byłoby znacznie szybciej, aby pominąć wszystkie uruchomione procesy SED i po prostu wykonać pracę w Pythonie

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) 

Będzie to działać znacznie szybciej, ponieważ nie będzie bulić wiele podprocesów.

+3

Myślę, że powinien to być "changed = data.replace (" "", "') zamiast tego. – msakya

Powiązane problemy