如何在Python中执行comm Linux命令

时间:2015-12-22 23:38:07

标签: python linux bash

我想从File1中提取File2中不存在的行

File1中

a  
b  
c  

文件2

a  
c  

所以输出应该是:

b  

bash中的一个可能的命令是:

comm -23 <(sort File1) <(sort File2) > File  

它在bash中运行得非常好,但我不知道在Python中如何正确实现。

我试过

import os  
os.system("comm -23 <(sort File1) <(sort File2) > File")  

并没有奏效。 任何提示?

3 个答案:

答案 0 :(得分:7)

纯python解决方案怎么样?

with open('file1', 'r') as f:
    lines1 = set(f.read().splitlines())

with open('file2', 'r') as f:
    lines2 = set(f.read().splitlines())

print(lines1.difference(lines2))

或者内存开销较少:

with open('file1') as f, open('file2') as f2:
    lines1 = set(map(str.rstrip, f))
    print(lines1.difference(map(str.rstrip, f2)))

答案 1 :(得分:3)

如果你必须使用shell,请安全地执行:

subprocess.call(['bash', '-c',
    'comm -23 <(sort "$1") <(sort "$2") >"$3"', '_',
    infile1_name, infile2_name, outfile_name])

也就是说:不要将文件名作为代码的一部分传递,而是将它们作为带外变量传递,以便shell无法解释它们的名称。

答案 2 :(得分:2)

它不起作用,因为您需要使用bash运行命令:

os.system("bash -c 'comm -23 <(sort File1) <(sort File2) > File'")

通常,os.system()使用sh运行命令。但是,bashsh之间的差别不大。

所以在这种情况下,我使用bash -c 'command'调用bash运行命令。然后它可以工作。

来自bash的手册:

  

-c如果存在-c选项,则从第一个非选项参数command_string读取命令。

     

如果在command_string之后有参数,则会将它们分配给位置参数,从$0开始。