使用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中添加的…谢谢!这很有帮助