如何将filecmp的report_full_disclosure()写入文本文件?
我想把一系列的 dircmp 的 report_full_disclosure() 输出到一个文本文件里。不过,report_full_disclosure() 的格式是一大块文本,它和 file.write(comparison_object.report_full_disclosure()) 不太兼容,因为 file.write() 需要写入一行文本。
我试着逐行处理 report_full_disclosure() 的报告,但也不行。有没有人遇到过这个问题?有没有其他的方法可以写入文件呢?
2 个回答
这个问题的答案可以在下面提到的另一个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()
在 dircmp.filecmp
这个模块里,生成报告的方法并不支持直接接受文件对象,它们只是用 print
语句(在 Python 3 中是 print()
函数)来输出内容。
你可以创建一个 dircmp.filecmp
的子类,让它的 report
、report_full_closure
和 report_partial_closure
方法可以接受一个文件参数(如果需要的话)。在每个 print ...
的地方,改成 print >>dest, ...
,这样就能把输出写到指定的文件里。如果 report_*_closure
方法是递归调用的,要把 dest
参数传递到递归调用中去。
我觉得不能把输出打印到特定文件的这个问题是个疏漏,所以如果你给这些方法添加了一个可选的文件参数,并且经过充分测试,你可以考虑把这个贡献给 Python 项目。
如果你的程序是单线程的,你可以在调用 report
方法之前,暂时把 sys.stdout 替换成你的目标文件。但是这种方法不太干净,也不太稳定,想象你的程序永远都是单线程的可能有点天真。