如何将filecmp的report_full_disclosure()写入文本文件?

2 投票
2 回答
1628 浏览
提问于 2025-04-18 04:55

我想把一系列的 dircmp 的 report_full_disclosure() 输出到一个文本文件里。不过,report_full_disclosure() 的格式是一大块文本,它和 file.write(comparison_object.report_full_disclosure()) 不太兼容,因为 file.write() 需要写入一行文本。

我试着逐行处理 report_full_disclosure() 的报告,但也不行。有没有人遇到过这个问题?有没有其他的方法可以写入文件呢?

2 个回答

1

这个问题的答案可以在下面提到的另一个StackOverflow帖子中找到:如何使用Python将'print'输出重定向到文件? 这里有一个例子,是我根据上面帖子提供的解决方案得到的:

>>> import sys
>>> import filecmp
>>> d = dircmp('Documents/dir1','Documents/dir2')
>>> orig_stdout = sys_stdout
>>> orig_stdout = sys.stdout
>>> fo = open('list_of_diff.txt','a+')
>>> sys.stdout = fo
>>> d.report()
>>> sys.stdout = orig_stdout
>>> fo.close()
2

dircmp.filecmp 这个模块里,生成报告的方法并不支持直接接受文件对象,它们只是用 print 语句(在 Python 3 中是 print() 函数)来输出内容。

你可以创建一个 dircmp.filecmp 的子类,让它的 reportreport_full_closurereport_partial_closure 方法可以接受一个文件参数(如果需要的话)。在每个 print ... 的地方,改成 print >>dest, ...,这样就能把输出写到指定的文件里。如果 report_*_closure 方法是递归调用的,要把 dest 参数传递到递归调用中去。

我觉得不能把输出打印到特定文件的这个问题是个疏漏,所以如果你给这些方法添加了一个可选的文件参数,并且经过充分测试,你可以考虑把这个贡献给 Python 项目。

如果你的程序是单线程的,你可以在调用 report 方法之前,暂时把 sys.stdout 替换成你的目标文件。但是这种方法不太干净,也不太稳定,想象你的程序永远都是单线程的可能有点天真。

撰写回答