是否有更优雅的方式来比较这两个文件?
现在我收到以下错误消息:syntax error near unexpected token (
... diff <( tr -d ' '
。
result = Popen("diff <( tr -d ' \n' <" + file1 + ") <( tr -d ' \n' <"
+ file2 + ") | wc =l", shell=True, stdout=PIPE).stdout.read()
Python似乎将"\n"
视为文字字符。
答案 0 :(得分:2)
您正在使用的构造由bash
解释,并且不构成可以传递给system()
或exec()
的独立语句。
<( ${CMD} )
< ${FILE}
${CMD1} | ${CMD2}
因此,您需要自己连接重定向和管道,或者请bash
为您解释该行(如@ wizzwizz4建议的那样)。
更好的解决方案是使用difflib
之类的内容,在内部对您的流程执行此操作,而不是调用system()
/ fork()
/ exec()
。
使用difflib.unified_diff
会得到类似的结果:
import difflib
def read_file_no_blanks(filename):
with open(filename, 'r') as f:
lines = f.readlines()
for line in lines:
if line == '\n':
continue
yield line
def count_differences(diff_lines):
diff_count = 0
for line in diff_lines:
if line[0] not in [ '-', '+' ]:
continue
if line[0:3] in [ '---', '+++' ]:
continue
diff_count += 1
return diff_count
a_lines = list(read_file_no_blanks('a'))
b_lines = list(read_file_no_blanks('b'))
diff_lines = difflib.unified_diff(a_lines, b_lines)
diff_count = count_differences(diff_lines)
print('differences: %d' % ( diff_count ))
答案 1 :(得分:1)
当您修复语法错误时,这将失败,因为您尝试在实现为C bash
调用时使用system
语法。
如果您希望以这种方式执行此操作,请编写shell脚本或使用以下命令:
result = Popen(['bash', '-c',
"diff <( tr -d ' \n' <" + file1 + ") <( tr -d ' \n' <"
+ file2 + ") | wc =l"], shell=True, stdout=PIPE).stdout.read()
然而,这不是一个优雅的解决方案,因为它依赖于GNU coreutils和bash
。更优雅的解决方案是纯Python。您可以使用difflib
模块和re
模块执行此操作。