【发布时间】:2015-10-23 09:18:25
【问题描述】:
我正在编写一个 Python 脚本来比较两个文件。因此,我选择使用grep 作为外部程序,启动以下两个命令:
grep -Fvf content1.txt content2.txt
grep -Fvf content2.txt content1.txt
从这些命令的结果给我的差异,我可以通过计算行数来提取差异的数量。
为了在 Python 脚本中执行此操作,我将这些 grep 命令嵌入到 subprocess.Popen() 函数中:
try:
output1, errors1 = subprocess.Popen(
["c:\\cygwin\\bin\\grep", "-Fvf", "content1.txt", "content2.txt"],
shell=True, stdout=PIPE, stderr=PIPE).communicate()
output2, errors2 = subprocess.Popen(
["c:\\cygwin\\bin\\grep", "-Fvf", "content2.txt", "content1.txt"],
shell=True, stdout=PIPE, stderr=PIPE).communicate()
if (len(output1) + len(output2) + len(errors1) + len(errors2) > 0):
print("Result : there are differences:")
if (len(output1) + len(output2) > 0):
print(" Output differences : ")
print(output1)
# print (str(str(output1).count('\n'))); (*)
print(output2)
# print (str(str(output2).count('\n'))); (*)
if (len(errors1) + len(errors2) > 0):
print(" Errors : ")
print(errors1)
print(errors2)
else:
print("Result : both are equal")
except Exception as ex:
print("Result : Exception during comparison:")
print(ex)
raise
我已将两个有问题的行放在注释中(以(*) 结尾的行)。
如您所见,问题如下:
当我在命令提示符下启动命令时,我得到的结果是一堆字符串。通过计算这些字符串的数量,我可以获得我想要的结果(例如使用
wc -l)。-
当我在 Python 脚本中启动命令时,我得到的结果(
output1和output2)是字节而不是字符串。我曾希望对字符串的简单类型转换能让我有机会计算换行符的数量,从而计算差异的数量,但这太容易了。
我曾尝试使用wc -l,但subprocess.Popen() 内部的管道似乎不是一个好主意。
如何处理output1 和output2 结果以搜索差异数量?
【问题讨论】:
-
我看到您使用的是 cygwin,您可能想尝试将
universal_newlines=True添加到 subprocess.Popen 调用中。 -
使用外部 grep 代替标准库中的
difflib模块有什么特殊原因吗? -
你好 Serge,我是 Python 的新手,我不知道
difflib模块,我已经尝试了“filecmp”,但我并不满意。我现在仔细看看difflib。感谢您的建议。 -
不相关:您可以将
r'c:\cygwin\bin\grep.exe'(原始字符串文字)用于 Windows 路径。删除shell=True并将完整路径传递给grep.exe(包括文件扩展名)。 -
你考虑过
comm -3 <(sort file1) <(sort file2)吗?
标签: python python-3.x grep subprocess cygwin