我想从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")
并没有奏效。 任何提示?
答案 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
运行命令。但是,bash
和sh
之间的差别不大。
所以在这种情况下,我使用bash -c 'command'
调用bash
运行命令。然后它可以工作。
来自bash
的手册:
-c
如果存在-c
选项,则从第一个非选项参数command_string
读取命令。如果在
command_string
之后有参数,则会将它们分配给位置参数,从$0
开始。