比较两个文件并删除所有空格

时间:2018-04-09 10:28:14

标签: python bash

是否有更优雅的方式来比较这两个文件?

现在我收到以下错误消息: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"视为文字字符。

2 个答案:

答案 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模块执行此操作。