我有以下代码用于逐个比较多个文件,我想将结果(最后两行)写入文本文件。但结果文件是空的。任何人都知道为什么?
import difflib
from os import listdir
from os.path import isfile, join
mypath="D:\correctfiles\\112\\"
onlyfiles = [ f for f in listdir(mypath) if isfile(join(mypath,f)) ]
length = len(onlyfiles)
for i in range(0, length):
for j in range(i + 1, length):
fi = open(mypath + onlyfiles[i])
fj = open(mypath + onlyfiles[j])
ilines= fi.readlines()
jlines= fj.readlines()
d = difflib.Differ()
diff_list = list(d.compare(ilines, jlines))
n_adds, n_subs, n_eqs, n_wiered = 0, 0, 0, 0
for diff_item in diff_list:
if diff_item[0] == '+':
n_adds += 1
elif diff_item[0] == '-':
n_subs +=1
elif diff_item[0] == ' ':
n_eqs += 1
else:
n_wiered += 1
if n_eqs >= (len(ilines))/2 or n_eqs >= (len(jlines))/2:
if n_eqs != 0:
fh= open('D:\\outcome.txt', 'w')
print 'lines files %s: %d %s: %d' % (onlyfiles[i],len(ilines),onlyfiles[j], len(jlines))
print 'adds: %d subs: %d eqs: %d ?:%d ' % (n_adds, n_subs, n_eqs, n_wiered)
fh.close()
答案 0 :(得分:3)
您正在打印您的文字,而不是将其写入文件对象。使用fh.write()
在文件中写入行:
with open('D:\\outcome.txt', 'a') as fh:
fh.write('lines files %s: %d %s: %d\n' % (onlyfiles[i],len(ilines),onlyfiles[j], len(jlines)))
fh.write('adds: %d subs: %d eqs: %d ?:%d\n' % (n_adds, n_subs, n_eqs, n_wiered))
或者,使用(更加模糊和少用)>>
打印重定向语法:
with open('D:\\outcome.txt', 'a') as fh:
print >> fh, 'lines files %s: %d %s: %d' % (onlyfiles[i],len(ilines),onlyfiles[j], len(jlines)))
print >> fh, 'adds: %d subs: %d eqs: %d ?:%d' % (n_adds, n_subs, n_eqs, n_wiered))
在这两种情况下,我都会在追加模式下打开文件,添加新信息而不是替换文件内容。
或者,将for
循环的文件打开移动到以仅截断一次,然后在每次循环迭代中将行写入文件,然后再关闭一次循环完成后。当with
块完成或退出时,with
语句负责关闭文件对象。
答案 1 :(得分:2)
这部分:
print 'lines files %s: %d %s: %d' % (onlyfiles[i],len(ilines),onlyfiles[j], len(jlines))
print 'adds: %d subs: %d eqs: %d ?:%d ' % (n_adds, n_subs, n_eqs, n_wiered)
将输出打印到控制台,而不是文件。
您可以将其打印到文件中,将其更改为:
Python 2.x
print >> fh, 'lines files %s: %d %s: %d' % (onlyfiles[i],len(ilines),onlyfiles[j], len(jlines))
print >> fh, 'adds: %d subs: %d eqs: %d ?:%d ' % (n_adds, n_subs, n_eqs, n_wiered)
奖励:Python 3.x - 如果有人需要它:)
print('lines files %s: %d %s: %d' % (onlyfiles[i],len(ilines),onlyfiles[j], len(jlines)), file=fh)
print('adds: %d subs: %d eqs: %d ?:%d ' % (n_adds, n_subs, n_eqs, n_wiered), file=fh)