我正在编写python脚本来从输入文件中读取行,并将唯一的行(如果相同的行不在输出文件中)写入输出文件。不知何故,我的脚本总是将第一行输入文件附加到输出文件,即使输出文件中已有相同的行。我无法弄清楚为什么会这样。 任何人都可以知道为什么以及如何解决这个问题? 感谢,
import os
input_file= 'input.txt'
output_file = 'output.txt'
fo = open(output_file, 'a+')
flag = False
with open(input_file, 'r') as fi:
for line1 in fi:
print line1
for line2 in fo:
print line2
if line2 == line1:
flag = True
print('Found Match!!')
break
if flag == False:
fo.write(line1)
elif flag == True:
flag == False
fo.seek(0)
fo.close()
fi.close()
答案 0 :(得分:3)
以附加模式打开文件时,文件对象位置位于文件末尾。因此,第一次到达for line2 in fo:
时,fo
中没有任何行,因此跳过该块,flag
仍然为真,因此第一行是写入输出文件。之后,您执行fo.seek(0)
,因此您要检查后续行的整个文件。
答案 1 :(得分:1)
'r+'
而不是'a+'
,或者将fo.seek(0)
放在for
循环的开头而不是结尾。
也就是说,除了读取输入文件的每个行的整个输出文件之外,还有一个更好的方法。
def ensure_file_ends_with_newline(handle):
position = handle.tell()
handle.seek(-1, 2)
handle_end = handle.read(1)
if handle_end != '\n':
handle.write('\n')
handle.seek(position)
input_filepath = 'input.txt'
output_filepath = 'output.txt'
with open(input_file, 'r') as infile, open(output_file, 'r+') as outfile:
ensure_file_ends_with_newline(outfile)
written = set(outfile)
for line in infile:
if line not in written:
outfile.write(line)
written.add(line)
答案 2 :(得分:0)
您的旗帜从未设为False。
flag == True
是一个平等
flag = True
是一项任务。
尝试后者。
import os
input_file= 'input.txt'
output_file = 'output.txt'
fo = open(output_file, 'a+')
flag = False
with open(input_file, 'r') as fi:
for line1 in fi:
#print line1
for line2 in fo:
#print line2
if line2 == line1:
flag = True
print('Found Match!!')
print (line1,line2)
break
if flag == False:
fo.write(line1)
elif flag == True:
flag = False
fo.seek(0)