Python - 使用 subprocess 调用 sed?

13

我希望通过subprocess从Python调用sed。 我尝试使用的脚本如下,但是它将sed输出导向标准终端。 似乎在我的subprocess.call语句中无法识别'>'运算符。 有什么建议吗?

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
2个回答

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

@Robert,我今天早上还没有喝咖啡,但是我没有看到任何空格? - Nix
@Nix 我正在尝试完全重复您的建议,但是我无法运行 reduce_size=['sed ','-i', '/begin.*read/,/end.*read/d', sys.argv[1]]subprocess.call(reduce_size)。您能否告诉我我做错了什么? - Alexander Cska

9
跳过运行所有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 = data.replace('"','')
            target.write(changed)

这样做可以显著提高运行速度,因为它不会派生出大量的子进程。


4
我认为应该改为changed = data.replace('"',''),对吗? - msakya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接