Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用difflib.diff_字节比较python中的两个文件_Python_File_Python 3.x_Difflib - Fatal编程技术网

使用difflib.diff_字节比较python中的两个文件

使用difflib.diff_字节比较python中的两个文件,python,file,python-3.x,difflib,Python,File,Python 3.x,Difflib,假设我想用difflib.diff_bytes函数比较文件a和文件b,我该如何做 谢谢在下面的文章中,我假设您有Python 3.x(特别是3.5)。 让我们分析文档以了解函数: difflib.diff_字节(dfunc,a,b,fromfile=b'',tofile=b'',fromfiledate=b'',tofiledate=b'',n=3,lineterm=b'\n') 比较a和b (字节对象列表)使用dfunc;产生一系列的三角线 (也是字节)采用dfunc返回的格式。dfunc必须

假设我想用
difflib.diff_bytes
函数比较文件a和文件b,我该如何做


谢谢

在下面的文章中,我假设您有Python 3.x(特别是3.5)。
让我们分析文档以了解函数:

difflib.diff_字节(dfunc,a,b,fromfile=b'',tofile=b'',fromfiledate=b'',tofiledate=b'',n=3,lineterm=b'\n')
比较a和b (字节对象列表)使用dfunc;产生一系列的三角线 (也是字节)采用dfunc返回的格式。dfunc必须是一个 可调用,通常是统一的或上下文的

允许您比较编码未知或不一致的数据。全部的 除n以外的输入必须是字节对象,而不是str。无损工作 将所有输入(n除外)转换为str,并调用dfunc(a,b, fromfile、tofile、fromfiledate、tofiledate、n、lineterm)。输出 然后,dfunc的增量被转换回字节,因此 receive与a和b具有相同的未知/不一致编码

首先要注意的是bytes对象和str(ing)对象之间的区别。然后除了
n
之外的每个输入参数都必须包含字节对象

所以关键是使用这个函数并向它传递字节对象,而不是字符串。因此,如果您有一个字符串,那么应该在Python中使用
b
前缀,这将生成字节类型而不是str(ing)类型的实例。
我建议你阅读


因此,我将不再进一步解释该部分。
因为我发现
difflib.diff_bytes
上的文档有点晦涩,所以我决定直接看看CPython自己用来测试该函数的代码。
这是一个很好的练习,有助于理解如何使用此功能。
测试
difflib.diff_字节的代码位于

让我们检查该文件中的一个示例以了解发生了什么

def test_byte_content(self):


 # if we receive byte strings, we return byte strings
    a = [b'hello', b'andr\xe9']     # iso-8859-1 bytes
    b = [b'hello', b'andr\xc3\xa9'] # utf-8 bytes

    unified = difflib.unified_diff
    context = difflib.context_diff

    check = self.check
    check(difflib.diff_bytes(unified, a, a))
    check(difflib.diff_bytes(unified, a, b))

    # now with filenames (content and filenames are all bytes!)
    check(difflib.diff_bytes(unified, a, a, b'a', b'a'))
    check(difflib.diff_bytes(unified, a, b, b'a', b'b'))

    # and with filenames and dates
    check(difflib.diff_bytes(unified, a, a, b'a', b'a', b'2005', b'2013'))
    check(difflib.diff_bytes(unified, a, b, b'a', b'b', b'2005', b'2013'))

    # same all over again, with context diff
    check(difflib.diff_bytes(context, a, a))
    check(difflib.diff_bytes(context, a, b))
    check(difflib.diff_bytes(context, a, a, b'a', b'a'))
    check(difflib.diff_bytes(context, a, b, b'a', b'b'))
    check(difflib.diff_bytes(context, a, a, b'a', b'a', b'2005', b'2013'))
    check(difflib.diff_bytes(context, a, b, b'a', b'b', b'2005', b'2013'))
如您所见,a和b是包含每个文件内容的列表。然后程序定义两个变量,它们表示函数的
dfunc
参数。请注意“b”前缀
difflib.diff_bytes
将以字节对象的形式返回增量行。然后您必须编写自己的函数来检查它。
其中一个示例包含在该文件中的另一个测试中,该文件的差异中还包括文件名:

def test_byte_filenames(self):
    # somebody renamed a file from ISO-8859-2 to UTF-8
    fna = b'\xb3odz.txt'    # "łodz.txt"
    fnb = b'\xc5\x82odz.txt'

    # they transcoded the content at the same time
    a = [b'\xa3odz is a city in Poland.']
    b = [b'\xc5\x81odz is a city in Poland.']

    check = self.check
    unified = difflib.unified_diff
    context = difflib.context_diff
    check(difflib.diff_bytes(unified, a, b, fna, fnb))
    check(difflib.diff_bytes(context, a, b, fna, fnb))

    def assertDiff(expect, actual):
        # do not compare expect and equal as lists, because unittest
        # uses difflib to report difference between lists
        actual = list(actual)
        self.assertEqual(len(expect), len(actual))
        for e, a in zip(expect, actual):
            self.assertEqual(e, a)

    expect = [
        b'--- \xb3odz.txt',
        b'+++ \xc5\x82odz.txt',
        b'@@ -1 +1 @@',
        b'-\xa3odz is a city in Poland.',
        b'+\xc5\x81odz is a city in Poland.',
    ]
    actual = difflib.diff_bytes(unified, a, b, fna, fnb, lineterm=b'')
    assertDiff(expect, actual)

正如您现在看到的,文件名作为字节对象包含在增量行中。

我在Python 2.x或3.x中的
difflib
文档中的任何地方都没有看到对
diff_bytes
的引用。你需要澄清一下你的问题……啊。。。我的
python3
仍然是3.4.x-该例程是在3.5中添加的…谢谢!这很有帮助